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

rah*_*210 22 c++ reference lvalue dereference assignment-operator

我刚刚开始使用C++.我对赋值和解引用运算符的返回类型有点困惑.我正在阅读C++ Primer一书.在不同的场合,作者说,赋值运算符的返回类型是对左手操作数的类型的引用,但后来,他说返回类型是左手操作数的类型.我已经提到了C++ 11标准版.5.17,其中返回类型被描述为"左手操作数的左值".

同样,我无法弄清楚dereference是返回指向对象还是返回对象的引用.

这些陈述是否相同?如果是这样,那怎么样?任何解释将不胜感激.

Som*_*ame 28

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

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

取消引用操作符返回类型取决于您的内部逻辑,以适合您需要的方式定义它.

  • OP引用@LuchianGrigore:*C++ 11 Standard Sec.5.17,其中返回类型被描述为"左手操作数的左值".* (10认同)
  • 最后一条评论比整个答案更有用. (10认同)
  • “标准正确定义了赋值运算符的返回类型” - 如何? (2认同)

Luc*_*ore 9

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

A& A::operator = ( ... )
{
   return *this;
}
Run Code Online (Sandbox Code Playgroud)

是的,"引用左手操作数的类型"和"引用左手操作数的左值"意味着相同的事情.

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

struct smart_ptr
{
   T* innerPtr;
   T* smart_ptr::operator* ()
   {
      return innerPtr;
   }
}

smart_ptr p; 
T* x = *p;  
Run Code Online (Sandbox Code Playgroud)