为什么不允许丢弃const限定符?假设我们写道:
#include <iostream>
struct A
{
void operator=(const A&){ std::cout << "A&" << std::endl; }
void operator=(const A&&){ std::cout << "A&&" << std::endl; }
};
const A a;
A b;
int main()
{
a = b; //Error: discarding qualifier
}
有人不能提供标准禁止的参考吗?
答案 0 :(得分:6)
问题是a
是const
,因此operator=
不允许修改调用对象的const
。这是由operator=
- 正确性引起的。
将const
声明为operator=
是没有意义的,因为T&
的语义是它应该使用右侧值修改调用它的对象并返回const
引用左侧对象,如果左侧对象为const_cast
(int main()
{
A b;
const A a = b;
}
使用情况除外),则无法使用此对象。
另一方面,允许以下内容:
{{1}}
因为在那种情况下它是新常量对象的构造。
正如您所说,该标准在§9.3.2/ 3中指定了以下措辞:
只有当object-expression与成员函数一样是cv-qualified或less-cv-qualified时,才能在object-expression(5.2.5)上调用cv限定的成员函数。