按值返回时强制执行RVO /移动构造

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返回,按值返回,失败; 以该顺序.

有没有办法强制编译器永远不会按值返回,因为我的复制构造函数非常昂贵?

Dav*_*eas 9

编译器会尝试这样做:NRVO,通过r值ref返回,按值返回,失败; 以该顺序.

上述措辞不准确,可能表明您有误解.编译器可以使用NRVO(大部分都会),如果不可用,它将始终按值返回,不同之处在于返回值的构造方式.如果您的类型具有移动构造函数,则编译器必须使用该构造函数,并且只有在您的类型没有移动构造函数时才会使用复制构造函数.

也就是说,如果您的类型具有移动构造函数,则使用复制构造函数的编译器将不符合C++ 11.