Возможно ли, чтобы переменная-член считалась изменяемой только для данного блока функции / кода?
например
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 к методу вместо переменной?
Нет, это невозможно, по крайней мере, в 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 ]
Технически возможно обойти const
в этом случае, например:
void mutable_bar() const {
int& p_blah = const_cast<int&>(blah);
p_blah = 5; // no compiler error
}
Или какая-то похожая конструкция. Но вы действительно прыгаете через обручи, чтобы сделать то, что вы не должны быть в состоянии сделать. И, как говорится в комментарии к другому сообщению, это «неопределенное поведение», что означает, что в некоторых случаях он может даже не работать (или делать то, что вы ожидаете, что он будет делать).
Вы могли бы использовать const_cast
сделать член неконстантным в отдельных случаях. Это, наряду с соответствующим комментарием, может быть даже относительно чистым решением. По крайней мере, очевидно, что вы нарушаете const в ограниченной области вместо того, чтобы сделать его изменяемым во всем мире.