【发布时间】:2021-03-29 10:43:02
【问题描述】:
根据这个Wiki page下面的代码:
#include <iostream>
struct C {
C() = default;
C(const C&) { std::cout << "A copy was made.\n"; }
};
C f() {
return C();
}
int main() {
std::cout << "Hello World!\n";
C obj = f();
}
可能会产生不同的输出,具体取决于编译器和编译器的设置。
如果我无法预测程序的行为方式,我该如何编写程序?是否有我应该遵循的有关复制省略的一般准则?
【问题讨论】:
-
尊重 3/5/0 规则,不依赖于复制省略存在/不存在。
-
请注意,您的示例在 C++17 中是可预测的,没有副本。
-
您能否解释一下如果复制省略完成或未完成,您的程序会出现什么问题?
-
构造函数不应该有任何必要的副作用(例如
std::cout来表明调用了特定的构造函数),因为这些副作用不能保证会发生。构造函数是特殊的,编译器可以相当积极地优化它们。 -
一个有用的指导方针是编写代码,这样无论是否省略副本都无关紧要。 (如果出现这种情况,这通常是设计问题的征兆。)
标签: c++ copy-elision