如果二进制运算符+重载的返回值是const,它会干扰优化吗

Should the return value of binary operator+ overload be const and can it interfere with optimizations?

本文关键字:干扰 优化 const 运算符 二进制 重载 返回值 如果      更新时间:2023-10-16

给定示例代码:

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

我开始怀疑运算符+()是否真的应该返回常量Integer。Bruce Eckel在《用C++思考》中为类似的情况提供了运算符重载的例子,并且似乎更喜欢在返回类型上使用const修饰符。应该使用它吗?为什么?

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

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

当将c创建为ab的和时,编译器很可能会执行复制省略,Integer::operator+()将直接在c占用的位置创建结果(请参阅"想要速度?按值传递")。但是,当Integer::operator+()的返回类型被声明为const时,难道不会因为目标是非const而强制编译器执行复制吗?

返回Integer const可以防止出现以下情况:

(a + b) = c;

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

如果类的复制成本极高,并且可以支持有效地重新值引用,您可能希望避免const正因为如此,但在实践中,我怀疑这样的课程很少见你可以忽略他们。