0

我有一个声明为可变的 C++ 类字段。当它是 double 类型时,我可以毫无问题地在 const 方法中对其进行修改。但是当我将它的类型切换到一个重载了 operator= 的类时,我得到了这个重载的 operator= 不接受指向 this 的 const 指针的错误。这是 gcc 错误还是语言怪癖?

4

2 回答 2

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;
}
于 2012-10-31T16:35:59.280 回答
0

mutable具有对const隐式对象参数的限定无效的效果(5.2.5 类成员访问 [expr.ref],第 4 段):

[...] 如果E2声明为mutable成员,则类型E1.E2 为“<em>vq12 T”。如果E2未声明为mutable成员,则类型E1.E2为“<em>cq12 vq12 T”。

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

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

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

于 2012-10-31T16:35:52.067 回答