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

问题描述 投票:0回答:3

我刚刚开始学习 C++。我对赋值和取消引用运算符的返回类型有点困惑。我正在关注《C++ Primer》这本书。在不同的场合,作者都说赋值运算符的返回类型是对左手操作数类型的引用,但后来,他说返回类型是左手操作数的类型。我已经提到了 C++11 Standard Sec。 5.17,其中返回类型被描述为“引用左手操作数的左值”。

同样,我无法弄清楚取消引用是否返回指向的对象或对该对象的引用。

这些陈述等价吗?如果是的话,那怎么办?

c++ reference assignment-operator dereference lvalue
3个回答
45
投票

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

返回类型对于链接操作很重要。 考虑以下结构:

a = b = c;
。这应该等于
a = (b = c)
,即
c
应分配给
b
,而
b
分配给
a
。将其重写为
a.operator=(b.operator=(c))
。为了使对
a
的赋值能够正确工作,
b.operator=(c)
的返回类型必须引用内部赋值结果(它也适用于复制,但这只是不必要的开销)。

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


12
投票

它们都可以是任何东西,但是 通常

operator =
通过引用返回当前对象,即

A& A::operator = ( ... )
{
   return *this;
}

是的,“引用左手操作数的类型”和“左值引用左手操作数”意味着同样的事情。

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

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

smart_ptr p; 
T* x = *p;  

1
投票

我见过类似的问题,但我想最好使用

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

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

© www.soinside.com 2019 - 2024. All rights reserved.