St.*_*rio -2 c++ class operator-keyword
为什么不允许丢弃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
}
Run Code Online (Sandbox Code Playgroud)
有人不能提供标准不允许的参考吗?
那里存在的问题a是const,因此operator=,不允许修改被调用的对象.这是由const正确性引起的.
声明operator=是const没有意义的,因为它的语义operator=是它应该用右侧值修改它所调用的对象并返回T&对左侧对象的引用,如果左侧对象则不可能是const(不包括const_cast使用).
另一方面,允许以下内容:
int main()
{
A b;
const A a = b;
}
Run Code Online (Sandbox Code Playgroud)
因为在这种情况下,它构造了一个新的常量对象.
正如您所说,该标准在§9.3.2/ 3中指定了这一点,其措辞如下:
仅当object-expression与成员函数一样是cv-qualified或less-cv-qualified时,才能在object-expression(5.2.5)上调用cv限定的成员函数.