拥有一个公共拷贝构造函数会使小程序编译,但不会显示副作用"复制".
#includeclass 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; }
Steve Jessop.. 8
您使用了所谓的"复制初始化"(定义[decl.init]
).定义的含义是X
使用int
构造函数构造类型的临时对象,然后x
使用复制构造函数从临时对象初始化.
但是,该标准还允许[class.copy]
在这种情况下称为"复制构造函数省略"(在其中定义)的优化.如果应用该优化,则不存在临时性.x
使用int
构造函数构造,就像您编写所谓的"直接初始化"一样X x(1);
.
为了使您不会意外地编写在应用优化时编译的代码而不是在不应用优化时编写的代码,标准要求复制构造函数即使被省略也必须是可访问的.因此,构造函数必须是公共的,即使(使用您正在使用的编译器和选项)它也不会被调用.
在C++ 11中,移动构造函数被考虑,并且也有资格获得elision.但是这个类X
没有移动构造函数,所以C++ 11和C++ 03对于这个例子是相同的.