具有重载赋值运算符的可变字段

时间:2012-10-31 16:24:17

标签: c++ operator-overloading mutable

我有一个声明为可变的C ++类字段。当它是double类型时,我可以在const方法中修改它而没有问题。但是当我将它的类型切换到一个operator =重载的类时,我得到的错误是这个重载的operator =没有采用const指针。这是gcc bug还是语言怪癖?

2 个答案:

答案 0 :(得分:1)

当您怀疑编译器错误时,您应该说出您正在使用的编译器版本。你知道,虫子每天都会被杀死。

无论如何,这段代码与GCC 4.6.3编译得很好:

struct A
{
    void operator=(int)
    {
    }
};

struct B
{
    mutable A a;
};

int main()
{
    const B b;
    b.a = 42;
}

但是,当然,这不是(这是你的情况):

struct A
{
    mutable int m;
    void operator=(int x)
    {
        m = x;
    }
};

struct B
{
    A a;
};

int main()
{
    const B b;
    b.a = 42;
}

答案 1 :(得分:0)

mutable会导致对隐式对象参数的const限定无效( 5.2.5类成员访问[expr.ref] ,第4段):< / p>

  

[...]如果E2被声明为mutable成员,那么E1.E2的类型   是“ vq12 T”。如果未将E2声明为mutable成员,则E1.E2的类型为“ cq12 vq12 T”。

5.2.5适用于9.3.1p3的隐式成员访问:

  

在类X [...]的成员中使用 id-expression [...]时, id-expression 会被转换使用(*this)作为.运算符左侧的 postfix-expression 进入类成员访问表达式。

因此,在const方法中,mutable成员未被(观察到)const限定。您观察到的行为必须是编译器错误的结果。