Che cos'è Decltype (0 + 0)?
Domanda
(Spinto da una domanda.)
Dato N3290, §7.1.6.2p4, dove gli elementi dell'elenco non sono numerati, ma numerati qui per la nostra comodità:
Il tipo indicato da Decltype (E) è definito come segue:
- Se E è un'espressione ID non pari o un accesso senza pari membri della classe (5.2.5), Decltype (E) è il tipo di entità denominata da E. Se non esiste tale entità o se e nomina una serie di funzioni sovraccarichi, il programma è malformato;
- Altrimenti, se e è un XValue, DeclType (e) è t &&, dove t è il tipo di e;
- Altrimenti, se e è un LVALUE, Decltype (E) è T &, dove T è il tipo di e;
- Altrimenti, Decltype (E) è il tipo di e.
Qual è il tipo specificato da Decltype (0 + 0)?
L'articolo 1 non si applica, 2 potrebbe, ma in caso contrario, 3 non si applica e 4 sarebbe il risultato. Allora, cos'è un XValue ed è 0 + 0 a XValue?
§3.10p1:
Un XValue (un valore "scadente") si riferisce anche a un oggetto, di solito vicino alla fine della sua vita (in modo che le sue risorse possano essere spostate, per esempio). Un XValue è il risultato di alcuni tipi di espressioni che coinvolgono riferimenti RValue (8.3.2).
Non vedo nulla in §8.3.2 che sarebbe utile qui, ma so che "0 + 0" non comporta alcun referenze di RValue. Il letterale 0 è un prvalue, che è "un rValue che non è un XValue" (§3.10p1). Credo che "0 + 0" sia anche un prvalue. Se questo è vero, "Decltype (0 + 0)" sarebbe int (non int &&).
Mi sono perso qualcosa nella mia interpretazione? Questo codice è ben formato?
decltype(0 + 0) x; // Not initialized.
Il codice compila su GCC 4.7.0 20110427 e Clang 2.9 (Trunk 126116). Non sarebbe ben formato se il DeclType specificasse un tipo Int &&, ad esempio.
Nessuna soluzione corretta