2015-06-16 17 views
6

Heute sah ich einige Code wie folgt aus:'const declltype ((a))' deklariert keine const-Referenz?

int a = 0; 
const decltype((a)) x = 10; // Error 

const int b = 0; 
decltype ((b)) y = 42; // Correct 

Ich kann sehen, warum der richtige Code korrekt ist, aber ich kann nicht sehen, warum die falschen Code falsch ist.

Ich testete es und fand es nur ein wenig seltsam.

const decltype((a)) x = 10; Dies sollte eine const int& richtig definieren? Aber es kompiliert nicht! error: non-const lvalue reference to type 'int' cannot bind to a temporary of type 'int'.

Ich änderte es zu const decltype((a)) x = a; dann kompiliert es.

Nun, ist x eine const Referenz? Nein, ich habe festgestellt, dass es sich um eine nicht konstante Referenz handelt. Ich kann den Wert a durch x ändern.

Warum hat der Modifikator const keine Wirkung?

+4

Die "const" wird auf den Verweis (und ignoriert), anstatt auf den Typ, auf den verwiesen wird, angewendet. –

+3

Das Kombinieren von 'declltype' mit Modifikatoren funktioniert genauso wie das Anwenden von Modifikatoren auf einen' typedef'-ed-Typ. Es ist KEINE Textersetzung. –

+0

@ T.C. @ ben-voigt Oh, ich habe es. Also wird "const" auf den ganzen Körper von "int &" angewendet, um "const reference to int" zu sein, nicht nur kombiniert zu "const int &", Bezug auf const int ... Richtig? – CyberLuc

Antwort

8

Falsche Teil ist falsch, da const auf die volle Art angewendet wird, die int& ist und das Hinzufügen von const zu int& macht es int& const die const Referenz in int. Aber die Referenz ist const von Natur aus, so dass der const Teil einfach ignoriert wird. Daher ist der resultierende Typ immer noch int&

Verwandte Themen