C++ 没有可行的重载+;=,为什么?
运算符+定义了用户定义类型的添加,但+=未解析为该类型,为什么C++ 没有可行的重载+;=,为什么?,c++,C++,运算符+定义了用户定义类型的添加,但+=未解析为该类型,为什么 typedef std::array<std::uint64_t,4> myvec_t; inline myvec_t operator+(myvec_t foo, myvec_t bar){return mod_add(foo,bar);} myvec_t a,b; a+=b; // g++ says: error: no viable overloaded '+=' typedef std::array my
typedef std::array<std::uint64_t,4> myvec_t;
inline myvec_t operator+(myvec_t foo, myvec_t bar){return mod_add(foo,bar);}
myvec_t a,b;
a+=b; // g++ says: error: no viable overloaded '+='
typedef std::array myvec\t;
内联myvec_t运算符+(myvec_t foo,myvec_t bar){return mod_add(foo,bar);}
myvec_t a,b;
a+=b;//g++说:错误:没有可行的重载'+='
编辑:几个人充分回答了这个狭隘的问题,我会的
接受一个解释为什么标准允许人们超载“+=”(a,b)去做与之不同的事情的答案
a=a+b?因为没有证明
运算符+=
的过载,所以为运算符+
提供了过载
operator+=
overload是用
inline myvec_t& operator+=(myvec_t& foo, const myvec_t& bar)
{
foo = mod_add(foo,bar);
return foo;
}
请注意,您的
运算符+
实现效率非常低,因为它同时复制操作数并返回对象的一个副本,而总共只能复制1个副本(后者)。您为运算符+
声明/定义重载,并传递和返回副本:
inline myvec_t operator+(myvec_t foo, myvec_t bar){return mod_add(foo,bar);}
您希望重载运算符+=
并传递和返回
引用(假设mod_add
返回其结果):
+=
运算符是一个单独的运算符,它不是后面跟赋值的+
。事实上,对于二进制算术运算符(如+
)来说,应该通过组合赋值运算符实现该运算符。这就是您的运算符+
在其实现中应该使用的运算符+=
。@ArneJ不过,该运算符对当前主题有何影响?@Kostas您所说的“标准为什么允许这样做?”是什么意思?允许什么?你的意思是它允许a+=b
做与a=a+b
不同的事情吗?那么标准就不允许,但也不禁止。如果作为程序员,您希望做一些不同于+
的事情,然后是=
,那么这取决于您。这很糟糕,会导致混乱,但这取决于你。C++不会妨碍你做你想做的事情,如果你想在你的脚上开枪,那就由你自己决定了。Kostas,为什么不允许?在+=
中,您可以重用现有内存,而不是创建一个新对象并将其分配给此
,而+
不需要返回myvec\u t(即类似字符串生成器的模式)。请解释下注
inline myvec_t& operator+=(myvec_t& foo, const myvec_t& bar)
{
foo = mod_add(foo, bar);
return foo;
}