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:

  1. 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;
  2. Altrimenti, se e è un XValue, DeclType (e) è t &&, dove t è il tipo di e;
  3. Altrimenti, se e è un LVALUE, Decltype (E) è T &, dove T è il tipo di e;
  4. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top