Большая часть не имеет смысла.
Спецификатор и квалификатор определены в стандарте 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