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.
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. –