2010-02-24 9 views
14

Ich habe diesen Code Beispiel:Casting-Operator - konst vs nicht-const

class Number 
{ 
    int i; 
    public: 
    Number(int i1): i(i1) {} 
    operator int() const {return i;} 
}; 

Was die Auswirkungen des Entfernens des const Modifikator aus dem Casting-Operator sind? Beeinflusst das Autocasting und warum?

Antwort

28

Wenn der Konvertierungsoperator nicht const ist, können Sie nicht const Objekte konvertieren:

const Number n(5); 
int x = n; // error: cannot call non-const conversion operator 
+1

+1 - gut verdient. Hmmm - Ich möchte den Wert, der von einem konstanten Objekt genommen wurde, umwandeln, aber ich kann das nicht, weil die Konvertierung (die den Quellwert nicht verändert) nicht const ist. Stoppen Sie, schauen Sie und denken Sie nach, und die Argumentation ist offensichtlich - sie unterscheidet sich nicht von anderen Methoden. Aber ich höre immer noch dieses Twilight-Zone-Thema. Die (zumindest logische) Konstanz der Quelle ist Teil des erwarteten Verhaltens der Methode - was "Umwandlung" bedeutet. Aber wiederum sind konsistente Regeln zumindest konsistent. – Steve314

5

Die const Version kann unabhängig davon aufgerufen werden, ob die class Number Instanz const ist oder nicht. Wenn der Operator als nicht-konstant deklariert ist, kann er nur bei nichtkonstanten Entitäten aufgerufen werden. Wenn Sie versuchen, ihn implizit zu verwenden, wo er nicht aufgerufen werden kann, erhalten Sie einen Kompilierungsfehler.

+0

Meinten Sie "nur an * non-const * entities" ?? – legends2k

+0

@ Legends2k: Ja, behoben. Vielen Dank. – sharptooth

5

Wenn Sie eine Funktion wie dieses:

void f(const Number& n) 
{ 
    int n1 = n; 
} 

Es beginnt Übersetzungsfehler geben, wenn Sie Entferne const im Casting-Operator.