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

Корреляция между спецификатором и определителем?

const и volatile называются cv-qualifier спецификацией C.

Что такое различие между specifier и qualifier (cv-qualifier)? Является ли спецификатором также спецификатором?

Возможно ли, что qualifier имеет только lvalue?

Что такое квалификаторы, кроме cv-qualifier?

Имеет ли смысл мое понимание?

4b9b3361

Ответ 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-неквалифицированные версии типа различные типы; однако они должны имеют такое же представление и требования к выравниванию.

Хотя это не указано явно, в приведенном выше параграфе показана разница. Я признаю, что определения могут быть более строгими.