丢弃const限定符

Discarding const qualifier

本文关键字:const 丢弃      更新时间:2023-10-16

为什么不允许丢弃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
}

难道有人不能提供一个标准不允许的参考吗?

这里的问题是aconst,因此应该修改被调用的对象的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限定条件的成员函数。

相关文章: