考虑以下代码?
我想知道,如果我改变它(功能体仍然相同)
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)
现在,这是一段愚蠢的代码,毫无疑问,但是
例如,如果你的类error_code将有成员函数修改调用它们的对象,那么这些会如果通过复制而不是引用返回修改临时对象:
(ec |= x).normalize(); // whatever "normalizing" error code means...
Run Code Online (Sandbox Code Playgroud)