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&
?
答案 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。