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?
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. [...]
Tags und Links c++