Что означает "cv-unqualified" в C++?
Как из предмета. Я увидел эту терминологию в недавно заданном вопросе, и, очевидно, это хорошо установленный термин, но я не могу найти что-либо о stackru.
5 ответов
Существуют фундаментальные типы и составные типы. Основными типами являются арифметические типы, void
, а также std::nullptr_t
, Составные типы - это массивы, функции, указатели, ссылки, классы, объединения, перечисления и указатели на нестатические члены.
Cv-неквалифицированный тип - любой из этих типов.
Для любого cv-неквалифицированного типа существует три соответствующих cv-квалифицированных типа:
- квалифицированным - с
const
резюме-классификатор - изменчивый - с
volatile
резюме-классификатор - const-volatile-квалифицированный - с обоими
const
а такжеvolatile
CV-классификаторы
Обратите внимание, однако, что cv-квалификаторы, применяемые к типу массива, фактически применяются к его элементам.
Cv-квалифицированные и cv-неквалифицированные типы различны. То есть int
это отличный тип от const int
,
Тип "cv-unqualified", если у него нет cv-квалификаторов. CV-квалификатор является либо const
или же volatile
,
cv обозначает const
а также volatile
(и реже mutable
), два атрибута, определяющие тип. Вы можете манипулировать ими с std::remove_const
и тому подобное в C++11.
Отличный сайт cppreference дает вам больше информации.
Чтобы ответить на ваш вопрос, cv-неквалифицированный тип либо не имеет, либо удален из его cv-квалификаторов. Например int
это CV-неквалифицированная часть const volatile int
,
std::remove_cv<T>::type
это CV-неквалифицированная часть T
,
cv-unqualified тип - это тип, который не был указан ни одним из cv-квалификаторов. Они определяют два основных свойства типа: постоянство и изменчивость. См. C++03 3.9.3 CV-квалификаторы §1:
Тип, упомянутый в 3.9.1 и 3.9.2, является cv-неквалифицированным типом. Каждый тип, который является cv-неквалифицированным полным или неполным типом объекта или является недействительным (3.9), имеет три соответствующие cv-квалифицированные версии своего типа:
- квалифицированная версия,
- версия с изменчивой квалификацией и
- версия с константной изменчивостью.
Термин тип объекта (1.8) включает в себя cv-квалификаторы, указанные при создании объекта.
Наличие
const
спецификатор в decl-specier-seq объявляет объект с определенным типом объекта; такой объект называетсяconst object
,Наличие
volatile
спецификатор в decl-specier-seq объявляет объект типа volatilequalified объекта; такой объект называетсяvolatile object
,Наличие обоих cv-квалификаторов в declspecifier-seq объявляет объект типа const-volatile-qualified; такой объект называется
const volatile object
,
Обычно это означает "тот же тип, но с любым удаленным cv-квалификатором", поэтому (например) версия cv-unqualified void volatile * const x
было бы void *x
,
Обратите внимание, что здесь, однако, я удаляю cv-квалификаторы как из самого указателя, так и из того, на что он указывает. В большинстве случаев, cv-unqualified
будет ссылаться только на один объект за раз, так что cv-неквалифицированная версия самого указателя все равно будет void volatile *x
тогда как несвободная версия того, на что он указывает, будет void *const x
,
Я думаю, что первый шаг - понять возможные типы и что означает резюме:
const и volatile появляются в любом спецификаторе типа, включая decl-specier-seq грамматики объявления, чтобы указать постоянство или изменчивость объявляемого объекта или названного типа.
const - определяет, что тип является константой.
volatile - определяет, что тип является volatile.
объяснение
Для любого типа T (включая неполные типы), кроме типа функции или ссылочного типа, в системе типов C++ есть три более различных типа: const-квалифицированный T, volatile-квалифицированный T и const-volatile-квалифицированный T.
Примечание: считается, что типы массивов имеют ту же квалификацию cv, что и их типы элементов. Когда объект создается впервые, используемые cv-квалификаторы (которые могут быть частью decl-specier-seq или частью декларатора в объявлении или частью type-id в новом выражении) определяют постоянство или изменчивость объект, следующим образом:
const объект - объект, тип которого является const-квалифицированным или не изменяемым подобъектом объекта const. Такой объект нельзя изменить: попытка сделать это напрямую является ошибкой во время компиляции, а попытка сделать это косвенно (например, путем изменения объекта const посредством ссылки или указателя на неконстантный тип) приводит к неопределенному поведению.
volatile объект - объект, тип которого определен как volatile, или подобъект изменчивого объекта, или изменяемый подобъект const-volatile объекта. Каждый доступ (операция чтения или записи, вызов функции-члена и т. Д.), Выполненный с помощью выражения glvalue типа volatile-квалифицированного, рассматривается как видимый побочный эффект в целях оптимизации (то есть в пределах одного потока выполнения volatile доступ не может быть оптимизирован или переупорядочен с помощью другого видимого побочного эффекта, который упорядочен до или после упорядоченного доступа, что делает энергозависимые объекты пригодными для связи с обработчиком сигнала, но не с другим потоком выполнения, см. std::memory_order). Любая попытка обратиться к энергозависимому объекту через энергонезависимое значение l (например, через ссылку или указатель на энергонезависимый тип) приводит к неопределенному поведению.
const volatile объект - объект, тип которого является const-volatile-квалифицированным, неизменяемый подобъект const volatile объекта, const подобъект volatile объекта или неизменяемый volatile подобъект const объекта. Ведет себя как постоянный объект и как изменчивый объект.
Ссылка: Cpp ссылка