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