Временная изменчивость переменной-члена

Возможно ли, чтобы переменная-член считалась изменяемой только для данного блока функции / кода?

например

class Foo() {
int blah;
void bar() const {
blah = 5; // compiler error
}
void mutable_bar() const {
blah = 5; // no compiler error
}
}

примечание: в этом случае я НЕ хочу избавляться от const в mutable_bar, так как логический const будет сохранен.

Тот же вопрос, но с другой точки зрения: можно ли как-нибудь применить ключевое слово mutable к методу вместо переменной?

0

Решение

Нет, это невозможно, по крайней мере, в C ++. Вам нужно либо mutable или не const функция.
Также есть const_cast не используйте это, чтобы изменить вещи. В случае, если вы измените const_castиздание const значение, которое вы получаете неопределенное поведение.

7 [Примечание: в зависимости от типа объекта, операция записи через указатель, lvalue или указатель
к элементу данных, полученному в результате const_cast, который отбрасывает const-qualifier73 может производить неопределенное
поведение
(7.1.6.1). —Конечная записка]

4 За исключением того, что любой член класса, объявленный mutable (7.1.1), может быть изменен, любая попытка изменить const
объект в течение его жизни (3.8) приводит к неопределенному поведению.
….
5 Для другого примера

struct X {
mutable int i;
int j;
};
struct Y {
X x;
Y();
};
const Y y;
y.x.i++; // well-formed: mutable member can be modified
y.x.j++; // ill-formed: const-qualified member modified
Y* p = const_cast<Y*>(&y); // cast away const-ness of y
p->x.i = 99; // well-formed: mutable member can be modified
p->x.j = 99; // undefined: modifies a const member
—end example ]
3

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

Технически возможно обойти const в этом случае, например:

void mutable_bar() const {
int& p_blah = const_cast<int&>(blah);

p_blah = 5; // no compiler error
}

Или какая-то похожая конструкция. Но вы действительно прыгаете через обручи, чтобы сделать то, что вы не должны быть в состоянии сделать. И, как говорится в комментарии к другому сообщению, это «неопределенное поведение», что означает, что в некоторых случаях он может даже не работать (или делать то, что вы ожидаете, что он будет делать).

1

Вы могли бы использовать const_cast сделать член неконстантным в отдельных случаях. Это, наряду с соответствующим комментарием, может быть даже относительно чистым решением. По крайней мере, очевидно, что вы нарушаете const в ограниченной области вместо того, чтобы сделать его изменяемым во всем мире.

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