C++ 为什么在使用重载赋值运算符时会出现错误,但在使用编译器提供的赋值运算符时却不会出现错误?

C++ 为什么在使用重载赋值运算符时会出现错误,但在使用编译器提供的赋值运算符时却不会出现错误?,c++,class,operator-overloading,return-type,assignment-operator,C++,Class,Operator Overloading,Return Type,Assignment Operator,我尽力只放最重要的部分: 标题.h 在BigInt-BigInt::operator+const-BigInt&p中,当我试图返回res=a.BigInt::operator-b;,我得到一个错误;,但当我像这样返回它时就不会了:res=a.BigInt::operator-b;返回res;。但这只在重载=运算符时发生,编译器提供的运算符不会发生这种情况 错误:从“void”类型的返回值到函数返回类型“BigInt”返回res=a.BigInt::operator-b没有可行的转换 Your o

我尽力只放最重要的部分:

标题.h

在BigInt-BigInt::operator+const-BigInt&p中,当我试图返回res=a.BigInt::operator-b;,我得到一个错误;,但当我像这样返回它时就不会了:res=a.BigInt::operator-b;返回res;。但这只在重载=运算符时发生,编译器提供的运算符不会发生这种情况

错误:从“void”类型的返回值到函数返回类型“BigInt”返回res=a.BigInt::operator-b没有可行的转换

Your operator=返回void,不能在return res=a.BigInt::operator-b;中返回void;,正如错误消息所说,操作符+应该返回一个BigInt

您应该将operator=声明为返回BigInt&就像编译器生成的那样

BigInt& BigInt::operator = (const BigInt &p)
{
    (*this).vec = p.vec;
    (*this).neg = p.neg;
    return *this;
}
运算符=返回void,不能在return res=a.BigInt::operator-b;,正如错误消息所说,操作符+应该返回一个BigInt

您应该将operator=声明为返回BigInt&就像编译器生成的那样

BigInt& BigInt::operator = (const BigInt &p)
{
    (*this).vec = p.vec;
    (*this).neg = p.neg;
    return *this;
}
我不认为这是正确的无效返回。分配的结果应该是分配的值,这是允许您执行以下操作的原因:

a = b = 7
或者,更重要的是,在这种情况下:

return res = ...
运算符=可能会返回将值放入其中的变量的BigInt&值,例如:

BigInt &BigInt::operator=(const BigInt &p) {
    this->vec = p.vec;
    this->neg = p.neg;
    return *this;
}
我不认为这是正确的无效返回。分配的结果应该是分配的值,这是允许您执行以下操作的原因:

a = b = 7
或者,更重要的是,在这种情况下:

return res = ...
运算符=可能会返回将值放入其中的变量的BigInt&值,例如:

BigInt &BigInt::operator=(const BigInt &p) {
    this->vec = p.vec;
    this->neg = p.neg;
    return *this;
}

哦,我以为res会存储在这个指针上,所以当我修改*这个时,它会修改左操作数。但正如你所说,谢谢你@H-005:它确实修改了*这个,但这只是需要的两个效果中的一个,另一个是为赋值表达式返回一个值。换句话说,b=7将修改*这是b为7。但是,如果表达式b=7的结果是void类型,那么就不能执行a=b=7。哦,我认为res(例如)将存储在这个指针上,所以当我修改*this时,它会修改左操作数。但正如你所说,谢谢你@H-005:它确实修改了*这个,但这只是需要的两个效果中的一个,另一个是为赋值表达式返回一个值。换句话说,b=7将修改*这是b为7。但是,如果表达式b=7的结果是一个void类型,那么就不能执行a=b=7。是的,我认为修改*这就足够了。谢谢作为旁注,您还可以将赋值运算符声明为BigInt&operator=constbigint&noexcept=default;并避免在文件中定义它,否则您根本无法包含此运算符,请参见。到目前为止,您无法通过复制进行构造,并且没有移动操作。你也看到了。是的,我想修改一下就足够了。谢谢作为旁注,您还可以将赋值运算符声明为BigInt&operator=constbigint&noexcept=default;并避免在文件中定义它,否则您根本无法包含此运算符,请参见。到目前为止,您无法通过复制进行构造,并且没有移动操作。另见。