Корреляция между спецификатором и определителем?
const
и volatile
называются cv-qualifier
спецификацией C.
Что такое различие между specifier
и qualifier
(cv-qualifier
)? Является ли спецификатором также спецификатором?
Возможно ли, что qualifier
имеет только lvalue?
Что такое квалификаторы, кроме cv-qualifier
?
Имеет ли смысл мое понимание?
Ответы
Ответ 1
Большая часть этого не имеет смысла.
Спецификатор и определитель определены в стандарте С++. Квалификатор является просто неотъемлемой частью спецификатора. Например, спецификатор типа в объявлении может включать в себя cv-квалификаторы. Я не вижу причин процитировать все, начиная со стандарта на эту тему.
Cv-квалификаторы не ограничены lvalues. Rvalues типов классов также могут быть cv-квалифицированными. Можно cv-qualify rvalue типа non-class, но оно не будет иметь никакого эффекта и будет проигнорировано.
Использование квалификатора const
, которое вы показываете в вашем примере с помощью foo
, является просто синтаксической формой, что на самом деле означает, что конструктор const применяется к подразумеваемому параметру this
метода foo
: const A* this
. То есть в этом случае он действительно квалифицирует lvalue, но это *this
, а не foo
.
Термин квалификатор также появляется в контексте квалифицированных имен. Имя, подобное some_class::some_member
(или some_namespace::some_name
), называется квалифицированными именами, а часть some_class::
является классификатором.
Идея, что если что-то есть lvalue, то вы можете изменить его, это абсолютно неверно. Имеются модифицируемые значения ll и немодифицируемые lvalues. Объект, объявленный как const int i = 5
, является значением lvalue, но вы не можете его изменить. Обычные функции также являются lvalues в С++, но вы не можете изменять функцию.
Ответ 2
Cv-квалификатор - это спецификатор, фактически спецификатор типа.
Цитирование С++ 03 7.1:
Спецификаторами, которые могут использоваться в объявлении, являются
decl-specifier:
storage-class-specifier
type-specifier
function-specifier
friend
typedef
decl-specifier-seq:
decl-specifier-seq_opt
decl-specifier
... в то время как спецификаторы типов определены:
type-specifier:
simple-type-specifier
class-specifier
enum-specifier
elaborated-type-specifier
cv-qualifier
Что касается различия между спецификатором слова и квалификатором:
Каждый тип, который является cv-unqualified полным или неполный тип объекта или недействителен имеет три соответствующих cv-квалификационные версии этого типа: a const-квалифицированная версия, a нестабильной версии и Const-volatile-квалифицированная версия. долгосрочный тип объекта включает cv-квалификаторы, указанные в объект создается. Наличие const в decl-specifier-seq объявляет объект типа объекта с контеном; такие объект называется объектом const. наличие волатильного спецификатора в decl-specifier-seq объявляет объект типа летучих квалифицированных объектов; такой объект называется изменчивым объект. Наличие обоих cv-квалификаторы в decl-specifier-seq объявляет объект const-volatile-qualified тип объекта; такой объект называется const volatile объект. Квалифицированный или cv-неквалифицированные версии типа различные типы; однако они должны имеют такое же представление и требования к выравниванию.
Хотя это не указано явно, в приведенном выше параграфе показана разница. Я признаю, что определения могут быть более строгими.