C ++ - 为什么在op + =方面实现op +而不是相反?

时间:2016-07-25 23:53:47

标签: c++ operator-overloading code-reuse

为什么要实施:

T& T::operator+=( const T& rhs ) {
  *this = *this + rhs;
  return *this;
}

T operator+( const T& lhs, const T& rhs ) {
  // ... implementation ...
  return some_result;
}

比这更频繁地传播:

apps:
id     name
--     --------
1      Facebook
2      Twitter
3      Pokemon


markets:
id     app_id    code
--     ------    ----
1      1         US
2      1         CA
3      3         CA

是否有任何理由,或者只是一个随机的巧合,我看到人们在我阅读的文献中多次这样实现它,而从来没有反过来?

1 个答案:

答案 0 :(得分:9)

operator+必须创建一个新对象来保存结果。 operator+=不需要新对象。

如果你以operator+=的形式写operator+,那么你最终会为一个额外的新对象创建,一个任务(或交换)和一个破坏付出代价,所有这些都是你没有做到的。 ;需要。

除此之外,在许多处理器上,硬件直接支持+=和类似的操作,其中结果存储回一个输入寄存器,而没有用于存储到第三个寄存器(如{{1 }})。

顺便说一句,您的(原始的,现在编辑过的)代码中存在一个错误,它隐藏了部分额外工作。你真的需要:

+

更糟糕的是,您的{再次原创,现在已编辑过)建议T& T::operator+=( const T& rhs ) { *this = *this + rhs; // creation of temporary, move assignment, and destruction of temporary return *this; } 的实现无法正确返回新对象,而是返回悬空引用。这是未定义的行为。

对于那些感兴趣的人,使用pass-by-value可以进一步改进第一个operator+实现:

operator+

现在,如果T operator+( T lhs, const T& rhs ) { lhs += rhs; return lhs; } 的左手操作数是临时的,则将使用移动构造函数,避免复制。虽然使用NRVO,但无论如何,在结果代码中可能没有多大优势。