【问题标题】:Returning const values to leverage move semantics vs preventing stuff like (a+b)=c [duplicate]返回 const 值以利用移动语义与防止 (a+b)=c 之类的东西 [重复]
【发布时间】:2014-09-19 09:27:19
【问题描述】:

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

返回const 值不能被视为毫无意义。正如 Adam Burry 在评论中指出的那样,Scott Meyers 在 More Effective C++(第 6 项)中推荐它,我将在其中添加 Herb Sutter 的 Exceptional C++(第 20 项,类Mechanics,对应的GotW是available online)。

这样做的基本原理是,您希望编译器能够捕捉到像 (a+b)=c(哎呀,意思是 ==)这样的拼写错误,或者像 a++++ 这样的误导性陈述,这两者都被标记为开箱即用对于像int 这样的原始类型。所以对于像operator+operator++(int) 这样的东西,返回一个const 值确实有意义。

另一方面,正如已经指出的那样,返回 const 会阻止 C++11 的移动语义发挥作用,因为它们需要 const 右值引用。

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

【问题讨论】:

  • 我认为返回const 的“优势”之前被夸大了。仅仅为了避免一些可能的错字而改变函数的语义似乎有点过头了。所以我想说,你连蛋糕都不想吃,它不是很好吃。
  • 您可以使用引用限定符来限制您的 operator = 等。
  • 移动语义真的与operator=的返回值相关吗?我想不出在编写良好的代码中它们会出现的任何情况。 (可以构建人工示例,但它们不会出现在编写良好的代码中。)

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


【解决方案1】:

你可以做的而不是返回 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++11 标准的司法管辖区中非法。我不知道这样,所以你可能应该说代码是格式错误的。此外,您可能应该回答重复的问题而不是这个问题 - 它可以使用最近的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2023-03-30
相关资源
最近更新 更多