自操作员覆盖 - 按引用返回或按副本返回

Che*_*eng 3 c++

考虑以下代码?

我想知道,如果我改变它(功能体仍然相同)

error_code& operator|=(const error_code &e)
Run Code Online (Sandbox Code Playgroud)

error_code operator|=(const error_code &e)
Run Code Online (Sandbox Code Playgroud)

是否有可能发生的潜在错误?我看到的唯一区别是,它将执行额外的复制操作,除此之外,没什么大不了的.

那么,我应该坚持通过引用返回,还是无所谓?


class error_code {
public:
 error_code() : hi(0), lo(0) {}
 error_code(__int64 lo) : hi(0), lo(lo) {}
 error_code(__int64 hi, __int64 lo) : hi(hi), lo(lo) {}

 // How about return by copy?
 error_code& operator|=(const error_code &e) {
  this->hi |= e.hi;
  this->lo |= e.lo;
  return *this;
 }

 __int64 hi;
 __int64 lo;
};

error_code operator|(const error_code& e0, const error_code& e1) {
 return error_code(e0.hi | e1.hi, e0.lo | e1.lo); 
}

int main() {
 error_code e0(1);
 error_code e1(2);
 e0 |= e1;
}
Run Code Online (Sandbox Code Playgroud)

sbi*_*sbi 13

是否有可能发生的潜在错误?

是.这将不再按预期工作:

(ec |= x) = y;
Run Code Online (Sandbox Code Playgroud)

现在,这是一段愚蠢的代码,毫无疑问,但是

  1. 为其他类型的工作,
  2. 可能还有其他情况,这种差异很重要.

例如,如果你的类error_code将有成员函数修改调用它们的对象,那么这些会如果通过复制而不是引用返回修改临时对象:

(ec |= x).normalize();  // whatever "normalizing" error code means...
Run Code Online (Sandbox Code Playgroud)

  • @Yan:运算符重载的黄金法则:__如果有问题,请按照内容执行.__对于`int`,`(a | = b)= c`有效.(顺便说一句,这是一个无耻的插件:http://stackoverflow.com/questions/4421706/operator-overloading.) (2认同)