丢弃const限定符

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)

有人不能提供标准不允许的参考吗?

Sho*_*hoe 6

那里存在的问题aconst,因此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限定的成员函数.