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

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


person Stefano Borini    schedule 14.03.2013    source источник
comment
@LihO: из того, что я знаю о stackoverflow, копипаста не является предпочтительным методом решения вопроса. Обычно это включает в себя чрезвычайно подробный набор ответов с очень конкретными ссылками на спецификации.   -  person Stefano Borini    schedule 14.03.2013
comment
@StefanoBorini: второй результат поиска в Google cv-qualifiers ясен и исчерпывающий. Совсем не дрянной форум.   -  person Antoine    schedule 14.03.2013
comment
@Antoine: Забавно, как люди до сих пор предполагают, что то, что они находят в Google, это то, что кто-то другой находит в Google. Результаты поиска адаптированы к вашему традиционному поведению в Интернете. Это не мой второй результат. Даже не первая страница. На самом деле, я в основном получал неквалифицированные объявления о вакансиях в резюме. (вероятно, потому что я искал работу шесть месяцев назад)   -  person Stefano Borini    schedule 15.03.2013


Ответы (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.

person Joseph Mansfield    schedule 14.03.2013
comment
ничего себе, я не могу понять .. почему он называется «cv-unqualified»? было бы лучше, если бы вы сначала сказали нам, «что это значит», прежде чем «что это такое». конечно, теперь я знаю, что cv для const и volatile.. - person Chan Kim; 02.06.2016
comment
Почему указатели, [...] и указатели на нестатические элементы? Разве последнее не входит в первое? Или я что-то упускаю? - person Enlico; 27.11.2018
comment
Не следует ли убрать первые два абзаца? Какая разница, если мы просто скажем Тип может быть cv-квалифицированным и cv-неквалифицированным? - person uvsmtid; 17.05.2020

Тип считается "cv-unqualified", если у него нет cv-qualifiers. Cv-qualifer — это либо const, либо volatile.

person Dirk Holsopple    schedule 14.03.2013

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.

person LihO    schedule 14.03.2013

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.

person Antoine    schedule 14.03.2013
comment
Я сделал, но это не здесь. Я хочу это здесь. - person Stefano Borini; 14.03.2013
comment
Но это! Этот вопрос, например, относится к той же теме, но плакат показывает, что он провел некоторое исследование, чтобы понимает некоторые основы, но смущает некоторые конкретные моменты. Что я считаю духом этого сайта. - person Antoine; 14.03.2013
comment
Нет, это не так. Название вопроса не передает его содержания. Я хочу, чтобы любой, у кого возник тот же вопрос, что и у меня, зашел в Google и спросил, что означает cv unqualified, и добрался до этого вопроса, где он четко объяснен. С другой стороны, я думаю, что это похожее на пираний поведение сообщества stackoverflow против разумных, но кажущихся легкими вопросов действительно неприятно, и если бы была альтернатива, я бы уже переключился. Успокойте проклятых людей - person Stefano Borini; 15.03.2013

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

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

person Jerry Coffin    schedule 14.03.2013

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

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

person Bhupesh Pant    schedule 20.05.2019