Как вы определяете изменчивый указатель на const объект? - PullRequest
4 голосов
/ 05 ноября 2010

У меня есть класс, который содержит указатель на постоянное значение VARIANT вне класса, но иногда я хочу изменить этот указатель на ссылку на объект-член VARIANT самого класса.

Большинство экземпляров этогокласс будет const, поэтому я должен объявить указатель как изменяемый.

В Visual C ++ этот код, кажется, делает то, что я хочу:

VARIANT mutable const* m_value;

Однако, поскольку изменяемый объект должен бытьсвойство указателя, а не указателя, я думаю, что это будет правильный синтаксис:

VARIANT const * mutable m_value;

Подобно тому, как вы определяете постоянный указатель (а не указатель на объект const).Visual C ++ не принимает этот вариант, хотя.

предупреждение C4518: «изменяемый»: класс хранения или спецификатор типа здесь непредвиденный;игнорируется

Правильно ли работает Visual C ++ или я что-то упустил?Может ли другой компилятор, совместимый со стандартами, вести себя иначе?

Ответы [ 3 ]

8 голосов
/ 05 ноября 2010

Comeau online , похоже, согласен с VC ++ здесь.

И это также имеет смысл!Член класса может быть изменяемым только один раз, и не может считаться неконстантным указателем на изменяемый константный объект .«Изменяемый объект const» не имеет смысла.

Вы должны поставить mutable перед объявлением, так как оно находится в той же области, что и, например, static:

class A {
  static  int const* m_p1; // static modifiable pointer to a const object;
  mutable int const* m_p2; // mutable pointer to a const object
  ...
  mutable int *const m_p3; // DOES NOT MAKE sense

m_p3 не имеет смысла - вы объявляете элемент как «всегда mutabel» и как «всегда константный» одновременно.

7 голосов
/ 05 ноября 2010

VC ++ прав. В этом случае mutable является спецификатором класса хранилища, таким как static, extern и register. Так же, как

int const* static foo;

не будет компилироваться, так как спецификатор должен появляться в начале объявления.

0 голосов
/ 05 ноября 2010
...