Как от субъекта. Я видел эту терминологию в вопросе, который я недавно спросил, и, по-видимому, это хорошо установленный термин, но я не могу найти что-либо в stackoverflow.
Что означает "cv-unqualified" в С++?
Ответ 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 объекта. Ведет себя как постоянный объект и как изменчивый объект.