Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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++ 没有可行的重载+;=,为什么?_C++ - Fatal编程技术网

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;
}