2016-06-26 15 views
14

Nach dieser answer, ref sollte eine int sein.Warum declltype (a, b) wird zu einer Referenz ausgewertet?

Aber aus irgendeinem Grund, es zu int& ausgewertet, sowohl in gcc und MSVC2015, während decltype(b) richtig nur int ausgewertet wird. Warum?

int a = 1, b = 2; 
decltype(a, b) ref; // ref is int& 
decltype(b) var; // var is int 
+1

Vielleicht 'decltype (expr)' macht ein L-Wert-R-Wert-Konvertierung (nicht ODR verwendet) seines Ausdrucks, aber auch hier vielleicht der zweite Ausdruck, 'b' nicht tut, es bleibt wegen des Komma-Operators "b" als ein Wert, wobei der entsprechende Typ eine Referenz ist. –

Antwort

17

a, b ist ein Ausdruck. Nach decltype Regeln für Ausdrücke, wenn das Ergebnis des Ausdrucks einen L-Wert ist, wird Typ wie T&

7.1.6.2/4 Einfacher Typdeklarierer [dcl.type.simple]
abgeleitet wird für ein Ausdruck E, die durch decltype (e) bezeichnete Art wird wie folgt definiert:

  • wenn E eine unparenthesized id-Expression oder eine unparenthesized Klassenmitglied Zugang (5.2.5) ist, decltype (e) das Art der Entität benannt von e. Wenn es keine solche Entität gibt oder wenn eine Gruppe von überladenen Funktionen benannt wird, ist das Programm schlecht formatiert.
  • andernfalls, wenn e ein x-Wert ist, ist decltype (e) T & &, wobei T der Typ von e ist;
  • andernfalls, wenn e ein L-Wert ist, ist decltype (e) T &, wobei T der Typ von e ist;
  • andernfalls ist declltype (e) der Typ von e.

Der verwirrende Teil über Unterschied zwischen „Typ der von e benannte Entität“ und „Art der e ist leicht mit Beispiel zu verstehen:

Wenn einige Unternehmen e deklariert als int& e = x;, dann später, in Ausdruck e, Typ von e ist int und Typ der von e genannten Entität ist int&. Kurz gesagt, Typ e fällt Referenz Qualifiers.

+1

'a' ist auch ein lvalue, aber' declltype (a) 'wird als nur 'int', nicht' int & 'abgeleitet. –

+2

@ Peregring-lk Es gibt eine spezifische Regel für den Namen der Entität. Standardzitat in einer Sekunde. –

+0

Können Sie ein Zitat erstellen, dass "der Typ von' e', wobei 'int & e = x;', 'int'" ist? – Yakk

8

Aus dem gleichen Grund, aus dem decltype((a)) refref als Referenz (int &, statt int) erklären würde.

decltype Regeln unterscheiden sich, wenn sie mit Ausdrücken statt mit Entitäten arbeiten. Die Wertkategorie des Ausdrucks a, b ist ein L-Wert, daher liefert decltype(a, b)T& ->int &.

Siehe auch http://en.cppreference.com/w/cpp/language/decltype