gpt4 book ai didi

c++ - 为什么链接要求运算符返回引用?

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:56 25 4
gpt4 key购买 nike

应该返回引用的最流行的运算符是 operator=

class Alpha
{
int x;
int y;
std::string z;
public:
void print()
{ cout << "x " << x << " y " << y << " " << z << '\n'; }
Alpha(int xx=0, int yy=0, std::string zz=""): x(xx), y(yy), z(zz) {}
Alpha operator=(Alpha& another)
{
x = another.x;
y = another.y;
z = another.z;
return *this;
}


};

int main()
{
Alpha a(3,4,"abc"),b,c;
b=c=a;
return 0;
}

Clang 是这样说的:

clang++-3.6 new.cxx -o new new.cxx:70:3: error: no viable overloaded '=' b=c=a; ~^~~~ new.cxx:34:8: note: candidate function not viable: expects an l-value for 1st argument Alpha operator=(Alpha& another) ^ 1 error generated.

gcc 这个:

new.cxx:34:8: note: no known conversion for argument 1 from ‘Alpha’ to ‘Alpha&’

但是我无法理解理论上有什么问题。我认为会发生什么:

  1. 首先为对象c 调用operator=。它通过引用接收对象 a,将其值复制到 c 并返回其自身(对象 c)的匿名拷贝:调用复制 soncstructor。
  2. 然后为对象 b 调用 operator=。它需要右值引用,但我们只写了左值引用,所以出现错误。

我添加了 rval operator= 和复制构造函数,它接收左值引用并且一切正常,现在我不知道为什么(我应该编写接收 const Alpha& sAlpha&& s):

class Alpha
{
int x;
int y;
std::string z;
public:
void print()
{ cout << "x " << x << " y " << y << " " << z << '\n'; }
Alpha(int xx=0, int yy=0, std::string zz=""): x(xx), y(yy), z(zz) {}
//Alpha(Alpha&& s): x(s.x), y(s.y), z(s.z) {}
Alpha(Alpha&& ) = delete;
Alpha(Alpha& s): x(s.x), y(s.y), z(s.z) {}
Alpha operator=(Alpha& another)
{
x = another.x;
y = another.y;
z = another.z;
return *this;
}
Alpha operator=(Alpha&& another)
{
x = another.x;
y = another.y;
z = another.z;
return *this;
}

};

最佳答案

赋值运算符的签名

Alpha operator=(Alpha& another)

两个方面是不寻常的。首先是它返回分配给对象的拷贝。很少这样做。另一个是它接受一个非常量引用作为参数。

非 const 引用使其不接受临时对象作为参数(因为它们只会绑定(bind)到 const 左值引用)。

结合起来,这意味着从第一个 operator= 返回的临时值不能用作第二个 operator= 的参数。

您的选择是要么返回一个引用,要么使参数 Alpha const&。这两个选项可以单独使用,也可以组合使用。

正如您发现的,第三个选项是显式添加移动赋值运算符,使用专门接受临时对象的 Alpha&&

虽然标准方法是声明复制赋值运算符

Alpha& operator=(Alpha const& other);

除非您有非常的特殊原因选择另一个签名。

关于c++ - 为什么链接要求运算符返回引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35534782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com