У меня есть поле класса C ++, которое объявлено изменяемым. Когда он был типа double, я мог без проблем изменить его в методе const. Но когда я переключил его тип на класс, в котором оператор = перегружен, я получил ошибку, что этот перегруженный оператор = не принимает константный указатель на это. Это ошибка gcc или странная странность?
Когда вы подозреваете ошибку компилятора, вы должны сказать, какую версию компилятора вы используете. Вы знаете, ошибки убиваются каждый день.
В любом случае, этот код прекрасно компилируется с 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;
}
mutable
имеет эффект, который const
квалификация по неявному параметру объекта обнуляется (5.2.5 Доступ к членам класса [expr.ref], пункт 4):
[…] ЕслиE2
объявленmutable
член, то типE1.E2
является «VQ12T
». ЕслиE2
не объявленmutable
член, то типE1.E2
является «cq12 vq12T
».
5.2.5 применяется для неявного доступа к члену в 9.3.1p3:
Когда ID-выражение […] используется в классе
X
[…] ID-выражение превращается в выражение доступа члена класса с помощью(*this)
как постфикс-выражение слева от.
оператор.
Так в вашем const
метод mutable
член не является (замечено, чтобы) const-квалифицированным. Ваше наблюдаемое поведение должно быть результатом ошибки компилятора.