Das meiste davon ergibt keinen Sinn.
Die Spezifizierer und Qualifier sind im C++ - Standard definiert. Qualifier ist nur ein integraler Bestandteil eines Spezifizierer. Beispiel: type specifier in einer Deklaration kann cv-qualifiers enthalten. Ich sehe keinen Grund, alles aus dem Standard zu diesem Thema zu zitieren.
Cv-Qualifier sind nicht auf lvalues beschränkt. R-Werte von Klasse Typen können auch cv-qualifiziert werden. Es ist möglich, einen R-Wert eines Nicht-Klassen-Typs zu qualifizieren, aber dies hat keine Auswirkungen und wird ignoriert.
Die Verwendung von const
Qualifier, die Sie mit foo
in Ihrem Beispiel zeigen, ist nur eine syntaktische Form, die eigentlich bedeutet, dass das const-Qualifikationsspiel der impliziten this
Parameter der foo
Methode angewandt wird: const A* this
. I.e. In diesem Fall qualifiziert es tatsächlich einen lvalue, aber es ist *this
, nicht foo
.
Der Begriff Qualifier erscheint auch im Zusammenhang mit qualifizierten Namen. Name wie some_class::some_member
(oder some_namespace::some_name
) heißen qualifizierten Namen und der some_class::
Teil ist ein Qualifier.
Die Idee, dass wenn etwas ein Lvalue ist, dann können Sie es ändern, ist völlig inkorrekt. Es gibt veränderbare lvalues und nicht veränderbare lvalues. Ein Objekt, das als const int i = 5
deklariert ist, ist ein Lvalue, aber Sie können es nicht ändern. Normale Funktionen sind auch in C++ lvalues, aber Sie können eine Funktion nicht ändern.
+1 für "Ich sehe nicht den Grund, alles aus dem Standard zu diesem Thema zu zitieren.". Manchmal frage ich mich, ob die Leute denken, dass sie nur ein paar zufällige Standardzitate enthalten und ihre Antwort weniger falsch ist (ich spreche nicht über diesen Thread, aber es gibt viele amüsante Antwortfäden zu SO, wo das leider der Fall ist). –
Hey, jemand hat bewiesen, was ich gestern behauptet habe: http://meta.stackexchange.com/questions/51469/dont-forget-to-mention-sql-injection/51474#51474 –