在[C++11: 12.8/31]中有这样的说明:
引用自该规范: 在具有类返回类型的函数的返回语句中,当表达式是非易失性自动对象的名称(除了函数或catch子句参数),且具有与函数返回类型相同的cv非限定类型时,可以通过直接将自动对象构造到函数的返回值中来省略复制/移动操作。
这意味着:
将打印
为什么需要第二个拷贝构造函数?编译器不能简单地延长x的生命周期吗?
引用自该规范: 在具有类返回类型的函数的返回语句中,当表达式是非易失性自动对象的名称(除了函数或catch子句参数),且具有与函数返回类型相同的cv非限定类型时,可以通过直接将自动对象构造到函数的返回值中来省略复制/移动操作。
这意味着:
#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的生命周期吗?
no_rvo
的参数、no_rvo
的返回值和x_copy
)。可以省略x_copy
的构造(通过直接在x_copy
中构造no_rvo
的返回值)。 - Mankarsex_copy
的构造没有被省略? - jweyrichX(const X& other) no_rvo X(const X& other)
是不准确的,因为如果x_copy
的构造未被省略,代码也可以打印X(const X& other) no_rvo X(const X& other) X(const X& other)
。 - Mankarse