返回const值以利用移动语义与防止诸如(a + b)= c之类的东西

时间:2014-07-28 08:20:24

标签: c++ c++11 operator-overloading move-semantics

我认为this question有点被误解了。

返回const值并不是可以被视为无意义的东西。正如Adam Burry在评论中指出的那样,Scott Meyers在更有效的C ++ (第6项)中推荐它,我将添加Herb Sutter的 Exceptional C ++ (第20项,类力学,其相应的GotW是available online)。

执行此操作的基本原理是您希望编译器捕获类似(a+b)=c(oops,意为==)或误导性语句(如a++++)的拼写错误,这两种语句都被标记出来像int这样的原始类型的盒子。因此对于operator+operator++(int)之类的内容,返回const值确实有意义。

另一方面,正如已经指出的那样,返回const会阻止C ++ 11移动语义,因为它们需要 { {1}}右值参考。

所以我的问题是,我们真的不能吃蛋糕吗? (我找不到办法。)

1 个答案:

答案 0 :(得分:10)

你可以做什么而不是返回const元素是将方法限制为左值对象:

struct S
{
    S& operator =(const S& rhs) & // note the final &
                                  // to restrict this to be lvalue
    {
        // implementation
        return *this;
    }
};

所以用

S operator +(const S& lhs, const S& rhs);
S a, b, c;

以下是非法的:

(a + b) = c;

Live example