我有一个定义了普通构造函数和复制构造函数的类。
#include <iostream> class Bla { public: Bla() { std::cout << "Normal Constructor Called\n"; } Bla(const Bla& other) { std::cout << "Copy Constructor Called\n"; } }; int main() { Bla a = Bla(); // prints Normal Constructor }
在main函数中,它按照我的预期打印普通构造函数,并且只打印普通构造函数。但是,如果我将复制构造函数设置为类的私有成员,编译器会给出错误信息
error: âBla::Bla(const Bla&)â is private within this context
从外观上看,似乎调用了复制构造函数,但我没有看到从中打印出任何内容。是否隐式调用了复制构造函数?这是怎么回事?
在C++17之前,复制操作可能是 elided 但是复制构造函数仍然需要存在并可访问。
这是一种优化:即使它发生并复制 /move (since C++11) 构造函数没有被调用,它仍然必须存在并且可以访问(就好像根本没有进行优化一样),否则程序的格式就不正确:
/move (since C++11)
自C++17以来,由于强制删除副本,因此没有此类问题。
在以下情况下,编译器需要省略类对象的复制和移动构造,即使复制/移动构造函数和析构函数有明显的副作用。对象被直接构造到存储中,否则它们将被复制/移动到存储中。复制/移动构造函数不需要存在或可访问: