考虑以下代码:
#include <iostream>
using namespace std;
class some_class {
public:
some_class() {
}
some_class(const some_class&) {
cout << "copy!" << endl;
}
some_class call() {
cout << "is called" << endl;
return *this; // <-- should call the copy constructor
}
};
some_class create() {
return some_class();
}
static some_class origin;
static some_class copy = origin; // <-- should call the copy constructor
int main(void)
{
return 0;
}
当将原始对象赋值给副本时,会调用复制构造函数,这是有道理的。然而,如果我将副本的声明更改为
static some_class copy = some_class();
即使我使用create()
函数,也不会调用拷贝构造函数。但是当将其更改为
static some_class copy = some_class().call();
它确实会调用复制构造函数。 一些研究解释说,编译器允许优化掉复制构造函数,这听起来是一件好事。但是,如果复制构造函数不是默认的,那么它可能会或可能不会做一些明显的事情,对吗? 那么,什么时候编译器可以优化掉复制构造函数呢?
中,
copy`并没有被赋值,而是进行了_复制构造_(这是两个不同的概念)。 - Daniel Langr