изменяемое поле с перегруженным оператором присваивания

У меня есть поле класса C ++, которое объявлено изменяемым. Когда он был типа double, я мог без проблем изменить его в методе const. Но когда я переключил его тип на класс, в котором оператор = перегружен, я получил ошибку, что этот перегруженный оператор = не принимает константный указатель на это. Это ошибка gcc или странная странность?

0

Решение

Когда вы подозреваете ошибку компилятора, вы должны сказать, какую версию компилятора вы используете. Вы знаете, ошибки убиваются каждый день.

В любом случае, этот код прекрасно компилируется с 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

Другие решения

mutable имеет эффект, который const квалификация по неявному параметру объекта обнуляется (5.2.5 Доступ к членам класса [expr.ref], пункт 4):

[…] Если E2 объявлен mutable член, то тип E1.E2
является «VQ12 T». Если E2 не объявлен mutable член, то тип E1.E2 является «cq12 vq12 T».

5.2.5 применяется для неявного доступа к члену в 9.3.1p3:

Когда ID-выражение […] используется в классе X […] ID-выражение превращается в выражение доступа члена класса с помощью (*this) как постфикс-выражение слева от . оператор.

Так в вашем const метод mutable член не является (замечено, чтобы) const-квалифицированным. Ваше наблюдаемое поведение должно быть результатом ошибки компилятора.

0

По вопросам рекламы [email protected]