2010-11-05 3 views
4

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

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

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

VARIANT mutable const* m_value; 

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

VARIANT const * mutable m_value; 

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

Предупреждение C4518: 'mutable': тип или класс хранилища или спецификаторы типов; игнорируется

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

ответ

8

Comeau online, кажется, согласны с VC++ здесь.

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

Вы должны поставить 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 »и« всегда const »одновременно.

+0

Спасибо за ответ! (и подсказка о Комо онлайн, может пригодиться в будущем). Да, я думаю, что имеет смысл, что mutable ведет себя (и «связывает») подобно статическому, а не const. –

6

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

int const* static foo; 

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

+0

Спасибо, это был короткий и лаконичный ответ! Я позабочусь о том, чтобы не путать спецификаторы классов хранения и классификаторы типов в будущем. –