从“T::operator+(const T& rhs) const”返回“const T”是一个好的实践吗?

3
我经常看到我的老师使用返回 const 值的 const operator +-*/。这样做是否明智?我应该为自己编写的每个类都这样做吗?(这里的 T 意味着任何重载了操作符 +-*/ 的结构体/类)。
例如:
struct Fraction
{
    //something here.
    const Fraction operator+(const Fraction &rhs) const;
    const Fraction operator-(const Fraction &rhs) const;
    const Fraction operator*(const Fraction &rhs) const;
    const Fraction operator/(const Fraction &rhs) const;
};

5
“const Student”在这里并没有太多意义。 - marcinj
2
返回const没有多少意义,而且会阻碍移动语义。 - juanchopanza
1
参考:运算符重载 - moooeeeep
3
我可以了解“乘法”学生的概念(即使结果通常要数年后才成为学生),但如果你把一个学生除以另一个学生,你得到什么样的学生呢? - molbdnilo
1
我确实同意“学生”这个词不太合适,已经把它改成了“分数”。 - acx_cosmos
显示剩余2条评论
2个回答

6
不行,这是一个不好的想法,因为它会抑制移动语义。例如下面的代码:
a = b + c;

如果b + c的临时结果不是const,可以将其移动到a,但如果它是const,则必须复制。相比移动操作,复制通常更昂贵。

在具有移动语义之前的历史时期,建议防止类似于(a + b) = c的荒谬行为。有人认为最好是使它导致编译时错误而不是奇怪的运行时行为。即使您同意该论点,这样做也会带来一些成本。


2
如果想要防止(a+b)=c;这种情况发生,也可以使用引用限定符。 - jrok

2
返回类型上的“const”在一般情况下和这种情况下都是不必要的。返回值是一个rvalue,修改它可能有意义,也可能没有,但通常返回类型(按值)不是“const”。这与返回引用形成对比,其中“const”可能会产生更大的差异。
假设使用了C++11,则返回类型为“const Fraction”将干扰通常的移动语义
考虑重载算术运算符(+-*/)时,建议遵循内置运算符的规范形式。通过可修改的右值返回结果,即不是const。对于这些运算符的赋值版本+=-=*=/=),通过引用返回值(通常为*this)。
T T::operator+(const T2 &b) const;
// and
T& T::operator+=(const T2& b);

这里成员方法上的const很有意义,一般情况下不会修改对象本身,因此建议将它们标记为const

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接