2010-08-31 44 views
11

const und volatile werden cv-qualifier von der C-Spezifikation genannt.Korrelation zwischen Spezifizierer und Qualifier?

Was genau ist zwischen und qualifier (cv-qualifier)? Ist ein Qualifier auch ein Spezifizierer?

Ist es notwendig, dass qualifier nur mit einem Lvalue ist?

Was sind andere Qualifikationsmerkmale als cv-qualifier?

Macht mein obiges Verständnis Sinn?

Antwort

6

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

+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). –

+1

Hey, jemand hat bewiesen, was ich gestern behauptet habe: http://meta.stackexchange.com/questions/51469/dont-forget-to-mention-sql-injection/51474#51474 –

3

Ein Lebenslauf-Qualifier ist ein Spezifizierer, eigentlich ein Typ-Spezifizierer.

Zitiert C++ 03 7.1:

die Spezifizierer, die in einer Erklärung verwendet werden kann

decl-specifier: 
    storage-class-specifier 
    type-specifier 
    function-specifier 
    friend 
    typedef 
decl-specifier-seq: 
    decl-specifier-seq_opt 
    decl-specifier 

sind ... während Typdeklarierer definiert sind:

type-specifier: 
    simple-type-specifier 
    class-specifier 
    enum-specifier 
    elaborated-type-specifier 
    cv-qualifier 

Was die Unterscheidung zwischen Wortbezeichner und Qualifier betrifft:

Jede Art, die ein cv-unqualifizierte vollständige oder unvollständiger Objekttyp ist oder entfällt hat drei cv-qualifizierte Versionen seiner Art entspricht: a const qualifizierte Version, eine volatile qualifizierte Version, und eine const-volatile-qualifizierte Version. Der Objekttyp " " enthält die CV-Qualifikationsmerkmale, die beim Erstellen des Objekts festgelegt wurden. Das Vorhandensein eines const-Spezifizierers in einem decl-specifier-seq deklariert ein Objekt des const-qualifizierten Objekttyps; Solch Objekt heißt ein const-Objekt. Das Vorhandensein eines flüchtigen Spezifizierers in einem decl-specifier-seq deklariert ein Objekt des flüchtigen qualifizierten Objekttyps; Dieses Objekt wird als flüchtiges Objekt bezeichnet. Das Vorhandensein von cv-Qualifiern in einem decl-specifier-seq deklariert ein Objekt const-volatile-qualifizierten Objekttyp; ein solches Objekt wird als const volatile Objekt bezeichnet. Die cv-qualifizierten oder cv-unqualifizierten Versionen eines Typs sind verschiedene Typen; sie müssen jedoch die gleiche Darstellung und Ausrichtungsanforderungen haben.

Während es nicht offensichtlich ist, zeigt der obige Absatz den Unterschied. Ich gebe zu, dass die Definitionen jedoch strenger sein könnten.

+1

Danke für die genaue Antwort. In dem von Ihnen zitierten Absatz wurde ich durch die gemischte Verwendung beider Wörter verwirrt: "... Das Vorhandensein eines const ** - Spezifizierers ** in einem decl-specifier-seq ... ... Das Vorhandensein eines volatilen ** Specifier ** in einem decl-specifier-seq ... ... Das Vorhandensein von ** cv-qualifiers ** in einem decl-specifier-seq ... ". Und da es in der Nähe dieses Absatzes keine Grammatikdefinitionen gibt, ist es nicht offensichtlich, ob "const" und "volatile" Spezifizierer oder Qualifier sind (oder Qualifier ist ein spezifischer Fall von Specifier oder umgekehrt). Danke noch einmal. –

Verwandte Themen