Casting zur Referenz in einer Vorlage scheint Const-Ness wegzuwerfen

8

Betrachten Sie den folgenden C ++ - Code:

%Vor%

Dies führt offensichtlich zu einem Compilerfehler, weil Sie keine veränderbare Referenz auf eine const-Zeichenfolge erstellen können. Mit GCC 4.7.2 ist der folgende Fehler:

%Vor%


ABER ... warum ist es so, dass wir, wenn wir das gleiche versuchen, nur den Referenztyp als Template-Parameter übergeben, dann scheint er plötzlich den const zu ignorieren -ness?

Überlegen Sie:

%Vor%

Der obige Code wird in GCC 4.7.2 ohne Warnungen kompiliert. Ich verstehe nicht, warum es kompiliert. Es scheint, dass der Ausdruck T(s) im Grunde genommen als C-Style-Cast interpretiert wird, der Const-Ness einfach wegwirft. Aber warum? Ich habe die Funktionsvorlage get mit T = std::string& instanziiert, daher sollte der Ausdruck return T(s) nicht kompiliert werden, weil s ist const . Aber es versagt nicht.

Ideone-Link: Ссылка

Ist das ein Compilerfehler? Oder gibt es einen gültigen Grund dafür?

    
Siler 23.02.2014, 19:05
quelle

1 Antwort

3

Du initialisierst nicht, du bist C-Style-Casting, was in der Tat die Fähigkeit hat, Konstanz wegzuwerfen.

Vom Standard:

  

5.2.3 Explizite Typumwandlung (funktionale Notation) [expr.type.conv]

     

1 Ein Simple-Type-Specifier (7.1.6.2) oder Typname-Specifier (14.6), gefolgt von einer in Klammern gesetzten Expression-Liste, konstruiert einen Wert des angegebenen Typs in der Ausdrucksliste . Wenn die Ausdrucksliste ein einzelner Ausdruck ist, ist der Typkonvertierungsausdruck dem definierten Ausdruck (5.4) äquivalent (definiert und wenn definiert).

     

5.4 Explizite Typumwandlung (Cast Notation)

     

1 Das Ergebnis des Ausdrucks (T) cast-expression ist vom Typ T. [...]

    
Yam Marcovic 23.02.2014, 19:33
quelle

Tags und Links