我有以下类,其中定义了普通构造函数和复制构造函数。
#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
}
在主函数中,它按我的预期打印普通构造函数,并且只打印普通构造函数。但是,如果我使复制构造函数成为类的私有成员,编译器会给我错误
error: ‘Bla::Bla(const Bla&)’ is private within this context
从外观上看,复制构造函数似乎被调用了,但我没有看到从中打印任何内容。复制构造函数是否被隐式调用?这里发生了什么?
在 C++17 之前,复制操作可能会被省略,但复制构造函数仍然需要存在且可访问。
这是一个优化:即使它发生并且
/move (since C++11)
没有调用复制构造函数,它仍然必须存在并且可以访问(好像根本没有发生优化),否则程序是错误的:
自 C++17 以来,由于强制复制省略而没有这样的问题。
在以下情况下,编译器必须省略类对象的复制和移动构造,即使复制/移动构造函数和析构函数具有可观察到的副作用。对象直接构建到存储中,否则它们将被复制/移动到。复制/移动构造函数不需要存在或可访问:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句