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

前端之家收集整理的这篇文章主要介绍了c – 返回const值以利用移动语义与防止诸如(a b)= c之类的东西[复制]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Isn’t the const modifier here unnecessary? 5个
我认为 this question有点被误解了.

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

这样做的理由是你希望编译器捕获类似于(ab)= c(oops,意思是==)的错别字,或像a这样的误导性语句,这两种语句都被标记为开箱即用的原始类型,如INT.因此对于像operator和operator(int)这样的东西,返回一个const值确实有意义.

另一方面,正如已经指出的那样,返回一个const可以防止C 11的移动语义被踢入,因为它们需要一个非const rvalue引用.

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

解决方法

你可以做什么而不是返回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

猜你在找的C&C++相关文章