在阅读了 Scott Meyers 的“More Effective C++”一书的第 20 和 22 条后,我决定提出这个问题。
假设您编写了一个类来表示有理数:
class Rational
{
public:
Rational(int numerator = 0, int denominator = 1);
int numerator() const;
int denominator() const;
Rational& operator+=(const Rational& rhs); // Does not create any temporary objects
...
};
现在假设您决定operator+
使用以下方法实现operator+=
:
const Rational operator+(const Rational& lhs, const Rational& rhs)
{
return Rational(lhs) += rhs;
}
我的问题是:如果禁用了返回值优化,会创建多少个临时变量operator+
?
Rational result, a, b;
...
result = a + b;
我相信创建了 2 个临时对象:一个Rational(lhs)
在 的主体内执行operator+
,另一个在operator+
通过复制第一个临时对象创建返回的值时。
当 Scott 介绍这个操作时,我产生了困惑:
Rational result, a, b, c, d;
...
result = a + b + c + d;
并写道:“可能使用 3 个临时对象,每次调用一个operator+
”。我相信如果禁用返回值优化,上面的操作将使用 6 个临时对象(每次调用 2 个operator+
),而如果启用,上面的操作将根本不使用临时对象。斯科特是如何得出他的结果的?我认为这样做的唯一方法是部分应用返回值优化。