Отличный вопрос. Я читал, что наличие volatileфункции-члена только делает thisуказатель изменчивым, поэтому элементы будут считываться из памяти при каждом обращении, но не являются «официально» изменчивыми.
Можно задать другой вопрос (или просто взглянуть на исходный вопрос по-другому):
Делает ли создание структуры constвсе ее членыconst ?
Если бы у меня был:
struct whatever {int data;};const whatever test;
Будет ли test.data const тоже ?
Мой ответ: да. Если вы объявляете объект типа whateverс, constтогда все его члены будутconst слишком
Точно так же, если вы объявляете объект типа whateverс, volatileтогда все его члены тоже будут volatile, точно так же, как если вы объявляете объект с const, все его члены будутconst .
constи volatileявляются двумя сторонами одной медали; они таковы, что в Стандарте их часто называют cv-qualifiers.
Цитата из Стандарта (7.1.5.1 $ / 8)
[Примечание: volatile - это подсказка для реализации, чтобы избежать агрессивной оптимизации, связанной с объектом,
потому что значение объекта может быть изменено средствами, не обнаруживаемыми реализацией. См. 1.9 для подробной семантики. В общем, семантика volatile в C ++ должна быть такой же, как и в C.]
Это означает, что если ваш объект является экземпляром структуры, то компилятор не может избежать агрессивной оптимизации с участием объекта , если он не избегает агрессивной оптимизации каждого из его членов. (В противном случае, как еще можно избежать оптимизации, связанной с объектом?)
Важно отметить, что константность распространяется только на непосредственных членов. Если ваша структура содержит указатель на какой-либо объект, сам указатель будет константным (например, вы не сможете переназначить его), но вы сможете изменить объект, на который указывает. (при условии, что ваша структура не содержит указатель на const)
volatile
функции-члена только делаетthis
указатель изменчивым, поэтому элементы будут считываться из памяти при каждом обращении, но не являются «официально» изменчивыми.Ответы:
Можно задать другой вопрос (или просто взглянуть на исходный вопрос по-другому):
Делает ли создание структуры
const
все ее членыconst
?Если бы у меня был:
Будет ли test.data
const
тоже ?Мой ответ: да. Если вы объявляете объект типа
whatever
с,const
тогда все его члены будутconst
слишкомТочно так же, если вы объявляете объект типа
whatever
с,volatile
тогда все его члены тоже будутvolatile
, точно так же, как если вы объявляете объект сconst
, все его члены будутconst
.const
иvolatile
являются двумя сторонами одной медали; они таковы, что в Стандарте их часто называютcv-qualifiers
.Цитата из Стандарта (7.1.5.1 $ / 8)
Это означает, что если ваш объект является экземпляром структуры, то компилятор не может избежать агрессивной оптимизации с участием объекта , если он не избегает агрессивной оптимизации каждого из его членов. (В противном случае, как еще можно избежать оптимизации, связанной с объектом?)
Связанная тема:
Почему мы используем ключевое слово volatile в C ++?
источник
От: http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx
Чтобы объявить объект, на который указывает указатель, как const или volatile, используйте объявление формы:
Чтобы объявить значение указателя, то есть фактический адрес, хранящийся в указателе, как const или volatile, используйте объявление формы:
источник