Корреляция между спецификатором и классификатором? - PullRequest
12 голосов
/ 31 августа 2010

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

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

Обязательно ли, чтобы qualifier имел только lvalue?

Какие квалификаторы, кроме cv-qualifier?мое понимание выше имеет смысл?

Ответы [ 2 ]

7 голосов
/ 31 августа 2010

Большая часть этого не имеет смысла.

Спецификатор и квалификатор определены в стандарте C ++. Квалификатор является неотъемлемой частью спецификатора .Например, спецификатор типа в объявлении может включать cv-qualifiers .Я не вижу смысла цитировать все из стандарта на эту тему.

Cv-квалификаторы не ограничиваются lvalues.R-значения типов class также могут быть cv-квалифицированными.Можно cv-квалифицировать r-значение не-классового типа, но оно не будет иметь никакого эффекта и будет игнорироваться.

Использование квалификатора const, который вы показываете в своем примере с foo,просто синтаксическая форма, которая фактически означает, что const-квалификатор применяется к подразумеваемому параметру this метода foo: const A* this.Т.е. в этом случае это действительно квалифицирует lvalue, но это *this, а не foo.

Термин квалификатор также появляется в контексте квалифицированных имен .Такие имена как some_class::some_member (или some_namespace::some_name) называются квалифицированными именами , а часть some_class:: является квалификатором .

Идея, что еслиLvalue, то вы можете изменить это совершенно неверно.Есть модифицируемые значения и немодифицируемые значения.Объект, объявленный как const int i = 5, является lvalue, но вы не можете его изменить.Обычные функции также являются значениями в C ++, но вы не можете изменять функцию.

3 голосов
/ 31 августа 2010

Спецификатор cv - это спецификатор, фактически спецификатор типа.

Цитирование C ++ 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-неквалифицированным полным или неполным объектомТип or void имеет три соответствующие cv-квалифицированные версии своего типа: const-квалифицированная версия, volatile-квалифицированная версия и const-volatile-квалифицированная версия.Термин тип объекта включает в себя cv-квалификаторы, указанные при создании объекта. Наличие спецификатора const в decl-specier-seq объявляет объект квалифицированного const типа объекта ;такой объект называется объектом const.Наличие volatile-спецификатора в decl-specier-seq объявляет объект типа volatile-квалифицированного объекта;такой объект называется летучим объектом.Наличие обоих cv-квалификаторов в decl-specier-seq объявляет объект типа const-volatile-квалифицированного объекта;такой объект называется постоянным летучим объектом.Варианты cv-квалифицированного или cv-неквалифицированного типа являются различными типами;однако они должны иметь одинаковые требования к представлению и выравниванию.

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

...