隐式调用复制构造函数?

nic*_*225 4 c++ constructor copy-constructor copy-elision

我有以下类,其中定义了普通构造函数和复制构造函数。

\n
#include <iostream>\n\nclass Bla\n{\npublic:\n    Bla()\n    {\n        std::cout << "Normal Constructor Called\\n";\n    }\n\n    Bla(const Bla& other)\n    {\n        std::cout << "Copy Constructor Called\\n";\n    }\n\n};\n\nint main() \n{\n    Bla a = Bla(); // prints Normal Constructor\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在主函数中,它按照我的预期打印普通构造函数,并且仅打印普通构造函数。但是,如果我将复制构造函数设为类的私有成员,编译器会给出错误

\n
error: \xe2\x80\x98Bla::Bla(const Bla&)\xe2\x80\x99 is private within this context\n
Run Code Online (Sandbox Code Playgroud)\n

从表面上看,似乎调用了复制构造函数,但我没有看到从中打印任何内容。复制构造函数是否被隐式调用?这里发生了什么?

\n

son*_*yao 5

在 C++17 之前,复制操作可能会被省略,但复制构造函数仍然需要存在且可访问。

这是一种优化:即使它发生并且复制/move (since C++11)构造函数没有被调用,它仍然必须存在并且可访问(就好像根本没有发生优化一样),否则程序是错误的:

从 C++17 开始,由于强制复制省略,就不存在这样的问题了。

在以下情况下,编译器需要省略类对象的复制和移动构造,即使复制/移动构造函数和析构函数具有可观察到的副作用。这些对象直接构造到存储中,否则它们将被复制/移动到存储中。复制/移动构造函数不需要存在或可访问: