我有一个声明为可变的 C++ 类字段。当它是 double 类型时,我可以毫无问题地在 const 方法中对其进行修改。但是当我将它的类型切换到一个重载了 operator= 的类时,我得到了这个重载的 operator= 不接受指向 this 的 const 指针的错误。这是 gcc 错误还是语言怪癖?
问问题
347 次
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>vq12T
”。如果E2
未声明为mutable
成员,则类型E1.E2
为“<em>cq12 vq12T
”。
5.2.5 适用于每个 9.3.1p3 的隐式成员访问:
当在类[...] 的成员中使用id-expression [...] 时, id-expression被转换为使用运算符左侧的后缀表达式的类成员访问表达式。
X
(*this)
.
因此,在您的const
方法中,该mutable
成员不是(被观察为)const-qualified。您观察到的行为必须是编译器错误的结果。
于 2012-10-31T16:35:52.067 回答