丢弃const限定符
Discarding const qualifier
为什么不允许丢弃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
}
难道有人不能提供一个标准不允许的参考吗?
这里的问题是a
是const
,因此应该修改被调用的对象的operator=
是不允许的。这是由const
-正确性引起的。
将operator=
声明为const
是没有意义的,因为operator=
的语义是,它应该用右边的值修改调用它的对象,并返回对左边对象的T&
引用,如果左边对象是const
(不包括const_cast
的使用),这是不可能的。
另一方面,允许下列情况:
int main()
{
A b;
const A a = b;
}
因为在这种情况下它是一个新的常量对象的结构
正如你所说的,标准在§9.3.2/3用以下措辞规定了这一点:
只有当对象表达式与成员函数相同或不相同时,才能在对象表达式(5.2.5)上调用具有cv限定条件的成员函数。