赋值运算符的返回类型是啥?

Posted

技术标签:

【中文标题】赋值运算符的返回类型是啥?【英文标题】:what is return type of assignment operator?赋值运算符的返回类型是什么? 【发布时间】:2013-02-23 22:22:37 【问题描述】:

我刚刚开始使用 C++。我对赋值和取消引用运算符的返回类型有点困惑。我正在关注 C++ Primer 一书。在各种情况下,作者说赋值运算符的返回类型是对左操作数的类型的引用,但后来他说返回类型是左操作数的类型。我已经提到了 C++11 Standard Sec。 5.17,其中返回类型被描述为“左值引用左操作数”。

同样,我不知道取消引用是返回指向对象还是对该对象的引用。

这些语句是否等效?如果是这样,那怎么办?任何解释将不胜感激。

【问题讨论】:

请大家注意。感谢所有回复,但我并不是要询问运算符重载。我还没到那里,我只是在问语言内置的赋值操作。 【参考方案1】:

它们都可以是任何东西,但通常operator =通过引用返回当前对象,即

A& A::operator = ( ... )

   return *this;

是的,“引用左手操作数的类型”和“引用左手操作数的左值”意思相同。

解引用操作符基本上可以有任何返回类型。它主要取决于程序的逻辑,因为您正在重载适用于对象的运算符,而不是指向对象的指针。通常,这用于智能指针或迭代器,并返回它们环绕的对象:

struct smart_ptr

   T* innerPtr;
   T* smart_ptr::operator* ()
   
      return innerPtr;
   


smart_ptr p; 
T* x = *p;  

【讨论】:

您能否扩展“左值引用左操作数”的含义与“引用左操作数的类型”相同。引用是左值吗? @user2148032 是的,引用是左值。左边的操作数是对象本身(因为x = y 有左边的操作数x)。【参考方案2】:

我也见过类似的问题,但我想最好还是用

X& X::operator=(const X&);

使用它,您将能够在链式分配中重用该对象。

【讨论】:

【参考方案3】:

标准正确定义了赋值运算符的返回类型。 实际上,赋值操作本身并不依赖于返回值——这就是为什么返回类型不容易理解的原因。

返回类型对于链接操作很重要。 考虑以下构造:a = b = c;。这应该等于a = (b = c),即c 应该分配到bba。将其重写为a.operator=(b.operator=(c))。为了使a 的赋值能够正常工作,b.operator=(c) 的返回类型必须引用内部赋值结果(它也适用于复制,但这只是不必要的开销)。

解引用运算符的返回类型取决于你的内部逻辑,以适合你需要的方式定义它。

【讨论】:

“标准正确定义了赋值运算符的返回类型”——如何? @LuchianGrigore 正如 OP 所引用的:C++11 标准秒。 5.17,其中返回类型被描述为“左值引用左操作数”。 这最后一条评论已经比整个答案更有用了。 我不禁注意到最后一条评论得到的支持程度。我发现许多人发现肤浅的正式注销比解释实际推理的详细答案更有用,这有点令人失望。是的,从技术上讲,您可以拥有一个返回值而不是引用的赋值运算符。

以上是关于赋值运算符的返回类型是啥?的主要内容,如果未能解决你的问题,请参考以下文章

verilog中的赋值运算符<=具体是啥意思

c++中为啥赋值运算符重载返回类型是引用

赋值运算符的返回类型

赋值运算符的返回类型

C ++中重载赋值运算符的返回类型[重复]

c语言中规定 赋值运算符的左边必须是啥?