(Angeregt durch eine Antwort .)
Gegeben N3290, §7.1.6.2p4, wo die Listenpunkte nicht nummeriert sind, aber hier der Einfachheit halber nummeriert sind:
Der durch decltype(e) bezeichnete Typ ist wie folgt definiert:
- Wenn e ein nicht parenthesierter id-Ausdruck oder ein nicht parenthesierter Klassenmitglied-Zugriff (5.2.5) ist, ist decltype(e) der Typ der Entität, die von e genannt wird. Wenn es keine solche Entität gibt oder wenn e eine Menge von überladenen Funktionen nennt, ist das Programm nicht formgerecht;
- 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;
- ansonsten ist decltype(e) der Typ von e.
Welcher Typ ist durch decltype(0 + 0) angegeben?
Punkt 1 trifft nicht zu, 2 könnte zutreffen, aber wenn nicht, dann trifft 3 nicht zu und 4 wäre das Ergebnis. Was ist also ein X-Wert, und ist 0 + 0 ein X-Wert?
§3.10p1:
Ein xvalue (ein "eXpiring"-Wert) bezieht sich ebenfalls auf ein Objekt, das in der Regel kurz vor dem Ende seiner Lebensdauer steht (so dass z. B. seine Ressourcen verschoben werden können). Ein xvalue ist das Ergebnis bestimmter Arten von Ausdrücken, die rvalue-Referenzen beinhalten (8.3.2).
Ich sehe in §8.3.2 nichts, was hier hilfreich wäre, aber ich weiß, dass "0 + 0" keine rvalue-Referenzen beinhaltet. Das Literal 0 ist ein prvalue, das heißt "ein rvalue, der kein xvalue ist" (§3.10p1). Ich glaube, "0 + 0" ist auch ein prvalue. Wenn das wahr ist, wäre "decltype(0 + 0)" int (nicht int&&).
Habe ich bei meiner Interpretation etwas übersehen? Ist dieser Code wohlgeformt?
decltype(0 + 0) x; // Not initialized.
Der Code kompiliert auf GCC 4.7.0 20110427 und Clang 2.9 (trunk 126116). Er wäre nicht wohlgeformt, wenn der Decltype z. B. einen int&&-Typ angeben würde.