Betrachten Sie den folgenden Code:
%Vor%Es kompiliert auf clang 3.5, während GCC 4.9 den folgenden Fehler gibt:
error: 'const' qualifiers cannot be applied to 'const int&'
Welcher entspricht dem Standard? Meine Vermutung ist, dass GCC standardkonform ist, genauso wie Sie int& const b = a;
nicht tun können.
Ich glaube, der Code ist gültig und die beiden Typen sind gleich.
[dcl.ref] / 1 sagt:
Cv-qualifizierte Referenzen sind schlecht formuliert, außer wenn die cv-Qualifikationsmerkmale durch die Verwendung eines typedef-name (7.1.3, 14.1) oder decltype-specifier (7.1.6.2), in diesem Fall werden die cv-Qualifikationsmerkmale ignoriert.
Da Sie den ersten const
durch einen decltype-specifier einführen, wird dieser ignoriert und Ihr erster Typ entspricht decltype(b)&
.
Jetzt sagt [dcl.ref] / 6:
Wenn ein typedef-name (7.1.3, 14.1) oder ein decltype-specifier (7.1.6.2) einen Typ
TR
bezeichnet, auf den Bezug genommen wird Der TypT
, ein Versuch, den Typ "lvalue reference to cvTR
" zu erstellen, erzeugt den Typ "lvalue reference toT
" [...]
Ihr declltype-specifier bezeichnet den Typ "reference to const int
" und Sie versuchen, eine lvalue-Referenz zu erstellen, sodass Sie einen lvalue-Verweis auf const int
erhalten.
Tags und Links c++ templates language-lawyer metaprogramming decltype