最初的问题与重载operator =有关,我喜欢分享我的发现,因为找到它们对我来说是非常重要的。 我无法想象使用(a = b)作为左值的合理例子。 在IRC和谷歌的帮助下,我发现了下一篇文章: http://msdn.microsoft.com/en-us/magazine/cc301415.aspx
它提供了两个例子。
(a=b)=c
f(T& );
f(a=b)
但两者都不好,我相信这是不好的做法。 第二个给我同样的感觉。 你能提供更好的例子,说明为什么它应该是非常数的?
答案 0 :(得分:11)
一个很好的理由是,在标准容器中可以使用类X
的标准中的一个要求是表达式a = b
必须具有类型X&
(其中{ {1}}是a
类型的左值,X
是b
类型的左值。
答案 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)
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时才有可能。