丢弃const限定符

时间:2015-05-28 16:28:23

标签: 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
}

有人不能提供标准禁止的参考吗?

1 个答案:

答案 0 :(得分:6)

问题是aconst,因此operator=不允许修改调用对象的const。这是由operator= - 正确性引起的。

const声明为operator=是没有意义的,因为T&的语义是它应该使用右侧值修改调用它的对象并返回const引用左侧对象,如果左侧对象为const_castint 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限定的成员函数。