Связь между спецификатором и квалификатором?

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

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

Нужно ли, чтобы qualifier было только с lvalue?

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

Имеет ли смысл мое вышеприведенное понимание?


person Sudhendu Sharma    schedule 31.08.2010    source источник


Ответы (2)


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

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

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

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

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

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

person AnT    schedule 31.08.2010
comment
+1, потому что я не вижу причин цитировать все из стандарта по этой теме. Иногда мне интересно, думают ли люди, что простое включение какой-то случайной стандартной цитаты делает их ответ менее неправильным (я не говорю об этой теме, но есть есть много забавных тем ответов на SO, где это так, к сожалению). - person Johannes Schaub - litb; 31.08.2010
comment
Эй, кто-то доказал то, что я вчера утверждал: упомянуть sql-инъекцию"> meta.stackexchange.com/questions/51469/ - person Johannes Schaub - litb; 01.09.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 или пустым, имеет три соответствующие версии с уточненным cv типом: версия с уточнением const, версия с уточнением volatile и версия с уточнением const-volatile. Тип объекта термина включает в себя квалификаторы cv, указанные при создании объекта. Присутствие спецификатора const в decl-specifier-seq объявляет объект с типом объекта, квалифицируемым как const; такой объект называется константным объектом. Наличие спецификатора volatile в decl-specifier-seq объявляет объект типа volatile-qualified; такой объект называется изменчивым объектом. Наличие обоих квалификаторов cv в decl-specifier-seq объявляет объект типа const-volatile-qualified; такой объект называется константным изменчивым объектом. Версии типа cv-qualified или cv-unqualified являются разными типами; однако они должны иметь одинаковые требования к представлению и выравниванию.

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

person Kornel Kisielewicz    schedule 31.08.2010
comment
Спасибо за точный ответ. В абзаце, который вы цитируете, меня смутило смешанное использование обоих слов: ... Наличие константного спецификатора в decl-specifier-seq... ... Наличие изменчивого < b>specifier в decl-specifier-seq... ...Наличие обоих cv-qualifiers в decl-specifier-seq.... И поскольку нет определения грамматики рядом с этим абзацем, не очевидно, являются ли const и volatile спецификаторами или квалификаторами (или квалификатор является частным случаем спецификатора или наоборот). Спасибо еще раз. - person Dmitrii Semikin; 02.05.2012