二元运算符+重载的返回值是否应该是const并且是否会干扰优化?

时间:2012-08-23 16:08:38

标签: c++ operator-overloading const c++03 copy-elision

给出示例代码:

class Integer
{
    int i_;
public:
    Integer(int i) : i_(i) {}
    const Integer operator+(const Integer &arg) const { return Integer(i_ + arg.i_); }
};

我开始想知道operator +()是否应该实际返回一个const Integer。 Bruce Eckel在“Thinking in C ++”中提供了类似情况的运算符重载的示例,并且似乎更倾向于返回类型的const修饰符。它应该被使用吗?为什么?

另一方面,让我们尝试使用这个类:

int main()
{
    Integer a(1), b(2);
    Integer c = a + b;
}

当创建 c 作为 a b 的总和时,编译器很可能执行复制省略,而Integer :: operator +()将直接在 c 所占据的位置创建其结果(参见“Want speed? Pass by value”)。但是当Integer :: operator +()的返回类型被声明为const时,不会强制编译器执行复制,因为目标是非const的吗?

1 个答案:

答案 0 :(得分:2)

返回Integer const可以防范以下内容:

(a + b) = c;

我从来没有发现这是一个太大的问题,但禁止它 确实使类型的行为更像内置类型。它不应该 对返回值优化有任何影响。

如果课程复制起来非常昂贵,并且可以支持 rvalue引用有效,您可能希望避免const 因为这些,但在实践中,我怀疑这类是罕见的 足以让你可以忽略它们。