C++ 我应该使用OR运算符返回常量引用还是仅返回引用
我在想,我是否应该让C++ 我应该使用OR运算符返回常量引用还是仅返回引用,c++,C++,我在想,我是否应该让操作符|=返回const error\u code&或error\u code&?它应该返回非consterror\u code&。通常,重载操作/equals运算符应该镜像整型语义并返回非常量引用。OR equals操作正在修改对象,因此返回const引用实际上没有意义。返回一个非常量引用还允许您链接或等于操作,与使用整型相同。选项1:返回一个非常量引用。这将允许您执行以下操作: class error_code { public: error_code() : hi(0
操作符|=
返回const error\u code&
或error\u code&
?它应该返回非consterror\u code&
。通常,重载操作/equals运算符应该镜像整型语义并返回非常量引用。OR equals操作正在修改对象,因此返回const
引用实际上没有意义。返回一个非常量引用还允许您链接或等于操作,与使用整型相同。选项1:返回一个非常量引用。这将允许您执行以下操作:
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;
}
选项2:返回常量引用。这将在上面给定的示例中产生错误,因为您不能对常量引用的e1
执行复合赋值
选择哪一个?我想说这是一个很难回答的问题,因为语言的本地类型遵循第一种选择,但这样做实际上是未定义的行为。采取第二种选择,将偏离模仿本地类型如果我正在编写类,我将返回常量引用。即使返回的类型是常量引用,也可以进行链接。你不能做的就是我在回答中给出的例子。@AraK:你确定你能把它作为成员函数吗?运算符|作为成员函数仅接受1个参数。我想让error_code result=123 | e0也能工作,这就是它不是成员函数的原因。Cheng CHOK抱歉,我在第一条评论中弄错了:)
error_code e1, e2, e3;
// same as: e1 = e3
(e1 = e2) = e3;