在 [C++11: 12.8/31] 中有说明:
这种复制/移动操作的省略,称为复制省略,是允许的[...]:
— 在具有类返回类型的函数的 return 语句中,当表达式是具有与函数返回类型相同的 cv 非限定类型的非易失性自动对象(函数或 catch 子句参数除外)的名称时,可以通过将自动对象直接构造到函数的返回值中来省略复制/移动操作
这意味着
#include <iostream>
using namespace std;
struct X
{
X() { }
X(const X& other) { cout << "X(const X& other)" << endl; }
};
X no_rvo(X x) {
cout << "no_rvo" << endl;
return x;
}
int main() {
X x_orig;
X x_copy = no_rvo(x_orig);
return 0;
}
将打印
X(const X& other)
no_rvo
X(const X& other)
为什么需要第二个复制构造函数?编译器不能简单地延长x的生命周期吗?