C++ 11是否保证return语句中的局部变量将被移动而不是复制?

xml*_*lmx 7 c++ rvalue-reference move-semantics rvo c++11

#include <vector>

using namespace std;

struct A
{
    A(const vector<int>&) {}
    A(vector<int>&&) {}
};

A f()
{
    vector<int> coll;
    return A{ coll }; // Which constructor of A will be called as per C++11?
}

int main()
{
    f();
}
Run Code Online (Sandbox Code Playgroud)

coll一个xvaluereturn A{ coll };

返回A(vector<int>&&)时是否会调用C++ 11保证f

Nic*_*las 11

C++ 11不允许coll移动.它只允许在return语句中隐式移动return <identifier>,其中<identifier>是局部变量的名称.任何比这更复杂的表达都不会隐式移动.

而比这更复杂的表达不会经历任何形式的省略.

  • +1; 注意那里有怪癖,如果`<identifier>`的类型与返回的类型不匹配,那么它就不会被移动.这在一个缺陷报告或C++ 14的变化中得到修复,我忘了哪个; 但是,如果您使用遗留编译器(或使用遗留编译器的风险),当类型不完全匹配时,"移动"可能是明智的(并且没有成本).同时,当类型完全匹配时,`move`会阻止elision.如果您使用相对古老的编译器,这只是一个问题. (4认同)