0

给定示例代码:

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创建为ab的总和时,编译器很可能会执行复制省略,并且 Integer::operator+() 将直接在c占用的位置创建其结果(请参阅“想要速度?按值传递”)。但是当 Integer::operator+() 的返回类型声明为 const 时,由于目标是非常量的,这不会强制编译器执行复制吗?

4

1 回答 1

2

返回 anInteger const可以防止以下情况:

(a + b) = c;

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

如果该类的复制成本非常高,并且可以有效地支持右值引用,那么您可能希望避免const 这样做,但实际上,我怀疑这样的类非常罕见,以至于您可以忽略它们。

于 2012-08-23T16:18:49.333 回答