没有可行的过载+=,为什么

No Viable Overloaded +=, why?

本文关键字:为什么      更新时间:2023-10-16

用户定义类型的加法是由运算符+定义的,但+=没有解析为它,为什么?

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 '+='

编辑:几个人充分回答了这个狭隘的问题,我会的接受一个答案,解释为什么标准允许人们超负荷地"+="(a,b(做一些不同于a=a+b?

您声明/定义operator+的重载并传递和return副本:

inline myvec_t operator+(myvec_t foo, myvec_t bar){return mod_add(foo,bar);}

您想重载operator+=并传递和return引用(假设mod_add返回其结果(:

inline myvec_t& operator+=(myvec_t& foo, const myvec_t& bar)
{
foo = mod_add(foo, bar);
return foo;
}

因为您没有证明operator+=过载,所以您为operator+提供了过载

operator+=过载由完成

inline myvec_t& operator+=(myvec_t& foo, const myvec_t& bar)
{
foo = mod_add(foo,bar);
return foo;
}

请注意,operator+实现非常无效,因为它复制了操作数并返回了对象的一个副本,而总共只复制了1个副本(后者(。