给出示例代码:
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的吗?
答案 0 :(得分:2)
返回Integer const
可以防范以下内容:
(a + b) = c;
我从来没有发现这是一个太大的问题,但禁止它 确实使类型的行为更像内置类型。它不应该 对返回值优化有任何影响。
如果课程复制起来非常昂贵,并且可以支持
rvalue引用有效,您可能希望避免const
因为这些,但在实践中,我怀疑这类是罕见的
足以让你可以忽略它们。