前段时间我被告知,实现两元操作符的通常模式需要在回报中采取最后的行动.
Matrix operator+(const Matrix &a,Matrix &&b) { b += a; return std::move(b); }
但现在有一个特殊的规则,在返回时,编译器可能会将返回值视为临时值,然后这不是必需的 – 简单的返回b就足够了.
但是再一次,b在这个函数中有一个名字,因此,它是一个LValue–这阻碍了编译器认为它是一个临时值,并且需要移动.
在最新版本的C 0x标准中,情况仍然如此吗?我们需要采取行动来实施上述模式吗?
解决方法
在此示例中,您需要显式的std :: move,因为b不是非易失性自动对象的名称.参考12.8 [class.copy] / p31 / b1:
- in a return statement in a function with a class return type,when
the expression is the name of a non-volatile automatic object (other than a function or catch-clause parameter) with the same cv- unqualified type as the function return type,the copy/move operation can be omitted by constructing the automatic object directly into the function’s return value