拥有一个公共(public)拷贝构造函数将使这个小程序 编译,但不显示副作用“复制”。
#include <iostream>
class X
{
public:
X(int) { std::cout << "Construct" << std::endl; }
// Having a public copy constructor will make the little program
// compile, but not showing the side effect "Copy".
private:
X(const X&) { std::cout << "Copy" << std::endl; }
private:
X& operator = (const X&);
};
int main() {
X x = 1;
return 0;
}
最佳答案
您已经使用了所谓的“复制初始化”(在[decl.init]
中定义)。定义的意思是使用int
构造函数构造一个X
类型的临时对象,然后使用复制构造函数从临时对象中初始化x
。
但是,在这种情况下,该标准还允许称为“复制构造函数省略”(在 [class.copy]
中定义)的优化。如果应用该优化,则没有临时的。 x
是使用 int
构造函数构造的,就好像您编写了所谓的“直接初始化”X x(1);
。
为了避免您不小心编写了在应用优化时编译但未应用优化时不编译的代码,标准要求复制构造函数必须可访问,即使它被省略也是如此。因此,构造函数必须是公共(public)的,即使(使用您正在使用的编译器和选项)它没有被调用。
在 C++11 中,考虑了移动构造函数,并且也有资格进行省略。然而,此类 X
没有移动构造函数,因此 C++11 和 C++03 对于此示例是相同的。
关于c++ - 为什么即使不调用公共(public)复制构造函数也需要它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20455382/