我有一个声明为可变的C ++类字段。当它是double类型时,我可以在const方法中修改它而没有问题。但是当我将它的类型切换到一个operator =重载的类时,我得到的错误是这个重载的operator =没有采用const指针。这是gcc bug还是语言怪癖?
答案 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
的类型 是“ vq12T
”。如果未将E2
声明为mutable
成员,则E1.E2
的类型为“ cq12 vq12T
”。
5.2.5适用于9.3.1p3的隐式成员访问:
在类
X
[...]的成员中使用 id-expression [...]时, id-expression 会被转换使用(*this)
作为.
运算符左侧的 postfix-expression 进入类成员访问表达式。
因此,在const
方法中,mutable
成员未被(观察到)const限定。您观察到的行为必须是编译器错误的结果。