35

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

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

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

4

3 回答 3

40

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

The return type is important for chaining operations. Consider the following construction: a = b = c;. This should be equal to a = (b = c), i.e. c should be assigned into b and b into a. Rewrite this as a.operator=(b.operator=(c)). In order for the assignment into a to work correctly the return type of b.operator=(c) must be reference to the inner assignment result (it will work with copy too but that's just an unnecessary overhead).

The dereference operator return type depends on your inner logic, define it in the way that suits your needs.

于 2013-03-08T11:41:05.900 回答
10

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

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

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

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

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

smart_ptr p; 
T* x = *p;  
于 2013-03-08T11:30:13.777 回答
1

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

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

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

于 2013-03-08T11:30:46.403 回答