C. *_*ent 4 c++ rvalue-reference move-constructor return-value-optimization c++11
假设我有一个带有复制构造函数和移动构造函数的对象'foo',以及一个函数
foo f() {
foo bar;
/* do some work */
return bar;
}
Run Code Online (Sandbox Code Playgroud)
该标准似乎表明编译器将尝试执行:NRVO,通过r值ref返回,按值返回,失败; 以该顺序.
有没有办法强制编译器永远不会按值返回,因为我的复制构造函数非常昂贵?
编译器会尝试这样做:NRVO,通过r值ref返回,按值返回,失败; 以该顺序.
上述措辞不准确,可能表明您有误解.编译器可以使用NRVO(大部分都会),如果不可用,它将始终按值返回,不同之处在于返回值的构造方式.如果您的类型具有移动构造函数,则编译器必须使用该构造函数,并且只有在您的类型没有移动构造函数时才会使用复制构造函数.
也就是说,如果您的类型具有移动构造函数,则使用复制构造函数的编译器将不符合C++ 11.