From CPP参考: http://en.cppreference.com/w/cpp/language/as_operator
删除了隐式声明的复制赋值运算符
类 T 的隐式声明或默认复制赋值运算符在以下任一条件为 true 时定义为已删除:
T has a non-static data member that is const
T has a non-static data member of a reference type.
T has a non-static data member that cannot be copy-assigned (has deleted, inaccessible, or ambiguous copy assignment operator)
T has direct or virtual base class that cannot be copy-assigned (has deleted, inaccessible, or ambiguous move assignment operator)
T has a user-declared move constructor
T has a user-declared move assignment operator
那么这告诉我导致删除的原因而不是原因?谁能解释一下:
T has a non-static data member of a reference type.
以及这是否足以在我的类中处理已删除的运算符:
T& T:operator=(T& t){};
如果我有一个基类的成员,它是引用类型。
我需要做些什么吗?operator=
比如显式声明return*this
或者编译器(g++)会为我处理这个问题吗?我需要对参考会员做一些特别的事情吗?很抱歉新手问题,但我是 C++ 新手,从托管语言(C# 和 Java)开始。
引用在初始化时就绑定到一个对象,之后就永远不能更改,您对它们所做的所有其他操作都会影响它们所绑定的对象,而不是引用本身。
因此,参考成员是在构造过程中设置的,并且永远不会更改。由于赋值运算符的目的是在构造后更改成员,因此当成员之一永远无法更改时,生成隐式赋值运算符是没有意义的。编译器拒绝尝试猜测您想要它做什么,并强制您提供自己的赋值运算符以及您想要的语义。
我是否需要在我的operator=中做任何事情,例如显式声明return *this,或者编译器(g++)会为我处理这个问题吗?
你绝对100%需要return *this;
在 C++ 中,唯一不需要显式返回的情况是函数返回void
or in main()
(其中有一个隐含的return 0;
如果到达函数末尾)或在异常情况下,例如永远不会返回的函数(永远循环或抛出异常)。
我需要对参考会员做一些特别的事情吗?
这取决于您期望类型分配具有什么语义。
如果您不希望它更改引用所绑定的对象,那么可以不对其执行任何操作。
如果您希望通过赋值来更改引用所绑定的对象,则需要这样做。
如果您希望将引用重新绑定到不同的对象,那么您就不走运了,C++ 不允许这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)