【发布时间】:2020-08-16 14:22:14
【问题描述】:
我正在尝试了解当函数按值返回时副本如何工作。我对以下代码感到困惑:
#include <iostream>
using namespace std;
class X {
public:
virtual ~X() { cout << "~X() " ; }
X() { cout << "X() "; }
X(X const& other) {
cout << "X(X const&) ";
}
};
X f(X x) {
cout << "# ";
return x;
}
X g(X x) {
X y = x;
cout << "# ";
return y;
}
int main() {
X a;
cout << endl << "f: ";
a = f(a);
cout << endl << "g: ";
a = g(a);
cout << endl;
}
输出是:
X()
f: X(X const&) # X(X const&) ~X() ~X()
g: X(X const&) X(X const&) # ~X() ~X()
~X()
这表明f 在返回之前会复制x,但g 不会。这怎么可能,x 不作为f 范围内的普通变量,因为它是它的参数之一?这种行为的一般规则是什么?
【问题讨论】:
-
“复制省略”(或者更确切地说是“NRVO”)在这里工作。
-
无论您是否在启用编译器优化的情况下构建可能都会在此处更改结果。
标签: c++