C++ 0x T运算符+(const T&,T &&)模式,还需要移动吗?

tow*_*owi 7 operator-overloading rvalue-reference c++11

前段时间我被告知,实现两元运营商的通常模式需要move在回报中获得最终结果.

Matrix operator+(const Matrix &a, Matrix &&b) {
    b += a;
    return std::move(b);
}
Run Code Online (Sandbox Code Playgroud)

但是现在有一个特殊的规则,在return编译器中可以将返回值视为临时值,然后这不是必需的 - 一个简单的return b就足够了.

但是,再一次,在这个函数中b有一个名字,因此,它是一个LValue - 这阻碍了编译器认为它是一个临时值,而且move是必需的.

在最新版本的C++ 0x标准中,情况仍然如此吗?我们需要move实现上述模式吗?

How*_*ant 7

std::move在此示例中需要显式,因为b它不是非易失性自动对象的名称.参考12.8 [class.copy]/p31/b1:

  • 在具有类返回类型的函数的return语句中,当表达式是具有与函数返回类型相同的cv-非限定类型的非易失性自动对象(函数或catch子句参数除外)的名称时,通过将自动对象直接构造到函数的返回值中,可以省略复制/移动操作

  • 啊,引用不是对象.我认为你应该强调"对象"而不是"自动"(或两者). (2认同)