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