Подтвердить что ты не робот

Что означает "cv-unqualified" в С++?

Как от субъекта. Я видел эту терминологию в вопросе, который я недавно спросил, и, по-видимому, это хорошо установленный термин, но я не могу найти что-либо в stackoverflow.

4b9b3361

Ответ 1

Существуют фундаментальные типы и составные типы. Основными типами являются арифметические типы, void и std::nullptr_t. Составные типы - это массивы, функции, указатели, ссылки, классы, объединения, перечисления и указатели на нестатические элементы.

Cv-неквалифицированный тип - это любой из этих типов.

Для любого cv-неквалифицированного типа существуют три соответствующих типа cv-qualified:

  • const-qual - с const cv-квалификатором
  • volatile-qualified - с volatile cv-qualifier
  • const-volatile-qual - с const и volatile cv-квалификаторами

Обратите внимание, однако, что cv-квалификаторы, применяемые к типу массива, действительно применяются к его элементам.

Cv-квалифицированные и cv-неквалифицированные типы различны. Это int является отличным типом от const int.

Ответ 2

Тип "cv-unqualified", если он не имеет каких-либо cv-квалификаторов. Cv-qualifer является либо const, либо volatile.

Ответ 3

cv-unqualified type - это тип, который не был указан ни одним из cv-квалификаторов. Они определяют два основных свойства типа: константа и волатильность. См. С++ 03 3.9.3 CV-квалификаторы §1:

Тип, упомянутый в пунктах 3.9.1 и 3.9.2, является cv-unqualified type. Каждый тип, который является неквалифицированным полным или неполным типом объекта или является недействительным (3.9), имеет три соответствующие версии его типа:

  • независимая от const версия,
  • версия с изменчивой квалификацией и
  • версия со стабильным энергопотреблением.

Термин тип объекта (1.8) включает в себя cv-квалификаторы, указанные при создании объекта.

Наличие спецификатора const в объявлении-specifier-seq объявляет объект типа const-qual; такой объект называется const object.

Наличие спецификатора volatile в объявлении-specifier-seq объявляет объект типа volatilequalified; такой объект называется volatile object.

Наличие обоих cv-квалификаторов в declspecifier-seq объявляет объект типа const-volatile-qual; такой объект называется const volatile object.

Ответ 4

cv означает const и volatile (и реже mutable), два атрибута, квалифицирующих тип. Вы можете манипулировать ими с помощью std::remove_const и тому подобного в С++ 11.

Отличный сайт cppreference предоставляет вам больше info.

Чтобы ответить на ваш вопрос, cv-неквалифицированный тип либо не имеет, либо лишен его cv-квалификаторов. Например, int является cv-неквалифицированной частью const volatile int.

std::remove_cv<T>::type является cv-неквалифицированной частью T.

Ответ 5

Обычно это означает "тот же тип, но с любым cv-квалификатором удалено", поэтому (например) cv-неквалифицированная версия void volatile * const x будет void *x.

Обратите внимание, что здесь, однако, я удаляю cv-квалификаторы как из самого указателя, так и из того, на что он указывает. В большинстве случаев cv-unqualified будет ссылаться только на один объект за раз, поэтому cv-неквалифицированная версия самого указателя все равно будет void volatile *x, тогда как версия cv-unqualfied, на которую он указывает, будет void *const x.

Ответ 6

Я думаю, что первый шаг - понять возможные типы:

const и volatile появляются в любом спецификаторе типа, включая decl-specier-seq грамматики объявления, чтобы указать постоянство или изменчивость объявляемого объекта или названного типа.

const - определяет, что тип является константой.

volatile - определяет, что тип является volatile.

объяснение

Для любого типа T (включая неполные типы), отличного от типа функции или ссылочного типа, в системе типов C++ есть три более различных типа: T с квалификацией const, T с квалификацией volatile и T с квалификацией const-volatile.

Примечание: считается, что типы массивов имеют ту же квалификацию 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 объекта. Ведет себя как постоянный объект и как изменчивый объект.