Это раздел 3.9.3 CV-квалификаторы из C ++ 11 черновик n3290:
Тип, упомянутый в 3.9.1 и 3.9.2, является cv-неквалифицированным типом. Каждый тип , который является резюме без квалификации
или неполный тип объекта или void (3.9) имеет три соответствующие cv-квалифицированные версии своего типа : a
версия с квалификацией const, версия с квалификацией volatile и версия с квалификацией const. Термин объект
Тип (1.8) включает в себя cv-квалификаторы, указанные при создании объекта. Наличие константного спецификатора
в decl-specier-seq объявляет объект с константным типом объекта; такой объект называется объектом const.
Присутствие volatile-спецификатора в decl-specier-seq объявляет объект типа volatile-квалифицированного объекта;
такой объект называется летучим объектом. Присутствие обоих cv-квалификаторов в decl-specier-seq объявляет
объект типа const-volatile-квалифицированного объекта; такой объект называется постоянным летучим объектом. CV-квалифицированный или
cv-неквалифицированные версии типа являются различными типами; однако они должны иметь одинаковое представление и
требования к выравниванию (3.9) .51
Так что const
и volatile
можно использовать в одних и тех же местах, возможно, в сочетании.
В пункте 3 этого раздела отмечается небольшая разница в том, как они применяются к объектам класса:
Каждый нестатический, не изменяемый , не ссылочный элемент данных объекта класса с константной квалификацией является константным
fied, каждый нестатический, не эталонный элемент данных объекта класса с изменяемой квалификацией является с квалификацией и
аналогично для членов класса const-volatile. См. 8.3.5 и 9.3.2 относительно типов функций, которые имеют
CV-классификаторы.
но это довольно логично.
volatile
-квалифицированные объекты имеют более строгие требования к правилу как если бы , а именно:
Доступ к летучим объектам оценивается строго по правилам абстрактной машины.
Волатильность привязывается к объекту таким же образом, const
делает:
dummy_class volatile* // non-volatile pointer to volatile object
dummy_class *volatile // volatile pointer to non-volatile object
dummy_class volatile *volatile // volatile pointer to volatile object
Для нестатических функций-членов (§9.3.1):
Нестатическая функция-член может быть объявлена как const, volatile или const volatile. Эти cv-квалификаторы
влияет на тип указателя this (9.3.2). Они также влияют на тип функции (8.3.5) функции-члена;
функция-член, объявленная const, является функцией-членом const, функция-член, объявленная как volatile,
функция volatile и функция-член, объявленная как const volatile, является постоянным членом
функция.
Таким образом, волатильность, подобная константности, применяется к типу this
внутри функции.
Ни const
, ни volatile
не могут быть применены к статическим функциям-членам.