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
实现上述模式吗?
std::move
在此示例中需要显式,因为b
它不是非易失性自动对象的名称.参考12.8 [class.copy]/p31/b1:
- 在具有类返回类型的函数的return语句中,当表达式是具有与函数返回类型相同的cv-非限定类型的非易失性自动对象(函数或catch子句参数除外)的名称时,通过将自动对象直接构造到函数的返回值中,可以省略复制/移动操作