Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该使用OR运算符返回常量引用还是仅返回引用_C++ - Fatal编程技术网

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&

它应该返回非const
error\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;