Что означает "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 ссылка

Другие вопросы по тегам