为什么operator =返回引用而不是const引用

时间:2010-06-03 20:09:18

标签: c++

最初的问题与重载operator =有关,我喜欢分享我的发现,因为找到它们对我来说是非常重要的。 我无法想象使用(a = b)作为左值的合理例子。 在IRC和谷歌的帮助下,我发现了下一篇文章:   http://msdn.microsoft.com/en-us/magazine/cc301415.aspx

它提供了两个例子。

  (a=b)=c

  f(T& );
  f(a=b)

但两者都不好,我相信这是不好的做法。 第二个给我同样的感觉。 你能提供更好的例子,说明为什么它应该是非常数的?

6 个答案:

答案 0 :(得分:11)

一个很好的理由是,在标准容器中可以使用类X的标准中的一个要求是表达式a = b必须具有类型X&(其中{ {1}}是a类型的左值,Xb类型的左值。

答案 1 :(得分:8)

最有可能的原因是这是语言的原生类型的工作方式。 e.g:

int x = 0, y = 1, z = 2;
(x = y) = z;

AFAIK,Stroustrup博士说,语言的一致性是一件好事。即用户定义的类型应该像本机类型一样。

答案 2 :(得分:2)

我花了一些时间,这是我的榜样:

class A
{
public:
    const A& operator= (const A& a) {return *this;}
};

int main(int argc, char* argv[])
{
    A a1;
    A& a2 = a1;
    A& a3 = (a2 = a1);
}

和编译器输出: :错误C2440:'初始化':无法从'const A'转换为'A&'

我在MS VS 2010上检查了它,但在其他平台上是否正确? 如果这个例子是=非const的充分条件?

答案 3 :(得分:2)

很久以前,Andrew Koenig写了一篇post。很多都归结为人们在轻微不寻常的情况下所期望的。他给出的例子是,在C中,return x=y;总是意味着与x=y; return x;相同。在C ++中,如果你基本上返回其他而不是引用(包括const引用),那么这两者可能意味着不同的东西。

编辑:对不起,我链接到了错误的帖子。试试this one。问题产生于T const &可以绑定到临时而不是“真实”对象的事实,所以上面的代码发生的是它创建了一个临时的,将对象复制到其中,绑定引用它,摧毁了临时,然后返回(现在悬空)参考。

答案 4 :(得分:1)

为什么它应该是常量?如果你指定它,显然它是可修改的。这将是人为的限制。

至于用例,为什么不:

T &local = t1 = t2 = t3;

在此示例中,local不是const。

答案 5 :(得分:0)

如果我们考虑三个auto_ptr a,b和c,则operator =必须返回一个非const引用,这样你就可以进行多次赋值,因为将指针指向另一个会修改第一个。

所以如果我们有a = b = c,会发生以下情况: c被赋值给b(c被修改为指向null),运算符返回对b的引用 由(b = c)返回的引用被赋值给a,因此它被修改为指向null,这只有在引用是非const时才有可能。