我应该使OR运算符返回const引用或仅引用

时间:2010-12-30 02:41:16

标签: c++

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) {}

 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;
}

我想知道,我是否应该让operator|=返回const error_code&error_code&

2 个答案:

答案 0 :(得分:3)

它应该返回非const error_code&。通常,重载的operation / equals运算符应该镜像整数类型语义并返回非const引用。 OR-equals操作是修改对象,因此返回const引用并没有多大意义。返回非const引用还允许您链接OR-equals操作,就像使用整数类型一样。

答案 1 :(得分:0)

选项1:返回非const引用。这将允许您执行以下操作:

error_code e1, e2, e3;
// same as: e1 = e3
(e1 = e2) = e3;

选项2:返回一个const引用。这会在上面的给定示例中产生错误,因为您无法在e1上进行复合赋值,这是一个const引用。

选择哪一个?我想说这是一个很难的问题,因为该语言的原生类型遵循第一个选项,但实际上它是未定义的行为。采取第二种选择,将偏离模仿本机类型。 如果我正在编写课程,我会返回一个const-reference。