复制省略是大多数编译器实现的一种优化,用于在某些情况下防止额外的(可能是昂贵的)复制。因此,如果您有一些代码正在创建未被使用的对象或没有副作用,
struct MyStruct { MyStruct() {} MyStruct(const MyStruct&) { std::cout << "Copied.\n"; } }; MyStruct f() { return MyStruct(); } int main() { std::cout << "Main\n"; MyStruct obj = f(); }
输出结果
您可以基于编译器和设置获得以下任何输出-
Main Main Copied Copied Main Copied
这意味着可以创建的对象比您预期的要少,因此您也不能依赖于要调用的特定数量的构造函数和析构函数。复制/移动构造函数或析构函数内部不应具有批判逻辑,因为您不能依赖于它们的调用。