Sehen Sie sich diesen Code an:
%Vor%Wenn ich das mit Visual C ++ 2013 November CTP kompiliere, bekomme ich:
"Fehler C2970: 'g': Vorlagenparameter 'temp': 's': Ein Ausdruck, der Objekte mit interner Verknüpfung enthält, kann nicht als Nicht-Typ-Argument verwendet werden"
Allerdings habe ich im C ++ 14 Standard (14.3.2 [temp.arg.nontype]) folgendes gelesen:
"ein konstanter Ausdruck (5.19), der die Adresse eines vollständigen Objekts mit statischer Speicherdauer und externer oder interner Verknüpfung oder"
bezeichnetIch interpretiere dies als "konstanten Ausdruck mit statischer Speicherdauer und externer Verknüpfung" oder "konstanter Ausdruck mit statischer Speicherdauer und interner Verknüpfung". In meinem obigen Beispiel ist die Variable s nicht ein "konstanter Ausdruck mit statischer Speicherdauer und interner Verknüpfung"?
Wenn ich s ändere:
std :: string s="abc";
Dann kompiliert es und es funktioniert, aber ist das nicht gegen den Standard, weil s jetzt kein "konstanter Ausdruck" mehr ist.
Kann jemand etwas Licht darauf werfen? Unterscheide ich hier etwas falsch?
In C ++ 98 war die Sprache (ab 14.3.2 / 1): the name of an object or function with external linkage...
. Die Änderung, um interne Verknüpfungen zuzulassen, wurde in C ++ 11 aufgenommen.
Ihr Compiler kompiliert wahrscheinlich nur als C ++ 98 (oder 03) Standard, nicht C ++ 11.
Ersetzen Sie static
durch extern
:
Der Grund ist, dass in C ++ 98 / C ++ 03 Verweise mit interner Verknüpfung als Template-Argument nicht erlaubt waren.
Beachten Sie auch, dass nur das Entfernen von static
nur würde nicht funktionieren, wenn const
vorhanden ist, weil const
Objekte deklariert sind Namespace-Level hat eine interne Verknüpfung (es sei denn, es wird extern
deklariert). Sie müssen extern
wie oben gezeigt verwenden.