为什么要实施:
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
是否有任何理由,或者只是一个随机的巧合,我看到人们在我阅读的文献中多次这样实现它,而从来没有反过来?
答案 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,但无论如何,在结果代码中可能没有多大优势。