2012-08-23 60 views
0

给出的示例代码:二元运算符+重载的返回值是否应为常量,是否会影响优化?

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

我开始怀疑运营商+()是否真的应该返回一个常量整数或没有。 “Thinking in C++”中的Bruce Eckel提供了运算符重载类似的例子,并且似乎赞成const返回类型的const修饰符。应该使用它,为什么?

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

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

当创建Ç作为一个 b编译器将最有可能进行复制省略和整数之和: :运算符+()将直接在由 c(请参阅“Want speed? Pass by value”)占用的地点创建其结果。但是,当Integer :: operator +()的返回类型被声明为const时,是否会强制编译器执行复制,因为目标是非const?

+4

在C++ 11中,您肯定希望通过非const返回,因为它是一个右值,因此您可能需要特别标记此[tag:C++ 03]。 –

+0

'const Integer'可以绑定到'const Integer&',所以你仍然有资格使用copy elision。然而,你不能再使用移动建筑。 –

+0

看起来像这样的重复(或至少我的答案张贴在那里,*答案*以及这个问题):[函数与返回值(C++)](http://stackoverflow.com/questions/7376554/functions-with -return-values-c) – Nawaz

回答

2

返回一个Integer const防止类似的事情:

(a + b) = c; 

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

如果类是复制非常昂贵,并且可以使有效地支持 右值引用,你可能想避免const 因为这些,但在实践中,我怀疑这样的类是罕见的 足够你可以忽视它们。

+1

最明显的(对我来说)带'operator +'的类的例子可以从移动中受益,它们是'std :: string'和'std :: valarray'。所以,如果你的班级有点像那些,那么他们不会稀罕得忽视。如果你的类只有像int这样的自包含数据成员,那么移动并不比副本更好。 –

相关问题