Qual è la categoria di valore degli operandi degli operatori C ++ quando non specificati?

PREMESSA:

Lo standard C ++ 11 classifica le espressioni in tre categorie di valori disgiunti: lvalues , xvalues e prvalues (§ 3.10 / 1). Qui è disponibile una spiegazione di quali categorie di valori sono disponibili.

Sto lottando per capire quali sono i requisiti dei diversi operatori sulla categoria di valore dei loro operandi. Il paragrafo 3.10 / 1 specifica:

[…] Ogni espressione appartiene esattamente a una delle classificazioni fondamentali di questa tassonomia: lvalue, xvalue o prvalue. Questa proprietà di un’espressione è chiamata la sua categoria di valore. [Nota: la discussione di ciascun operatore integrato nella Clausola 5 indica la categoria del valore che produce e le categorie di valore degli operandi che si aspetta . Ad esempio, gli operatori di assegnazione incorporati si aspettano che l’operando di sinistra sia un lvalue e che l’operando destro sia un valore di prvalore e produca un lvalue come risultato . Gli operatori definiti dall’utente sono funzioni e le categorie di valori che si aspettano e producono sono determinate dai rispettivi parametri e tipi di ritorno. -End note]

Nonostante quanto affermato nella nota precedente, la clausola 5 non è sempre molto chiara sulla categoria di valore degli operandi degli operatori. Questo è, ad esempio, tutto ciò che viene detto sulla categoria di valore degli operandi dell’operatore di assegnazione (paragrafo 5.17 / 1):

L’operatore di assegnazione (=) e gli operatori di assegnazione composti si raggruppano tutti da destra a sinistra. Tutti richiedono un lvalue modificabile come il loro operando di sinistra e restituiscono un lvalue che si riferisce all’operando di sinistra . Il risultato in tutti i casi è un campo di bit se l’operando di sinistra è un campo di bit. In tutti i casi, l’assegnazione viene eseguita in sequenza dopo il calcolo del valore degli operandi di destra e di sinistra e prima del calcolo del valore dell’espressione di assegnazione. Per quanto riguarda una chiamata di funzione a sequenza indeterminata, l’operazione di un’assegnazione composta è una singola valutazione. [Nota: pertanto, una chiamata di funzione non deve intervenire tra la conversione da valore a valore e l’effetto collaterale associato a qualsiasi operatore di assegnazione composto singolo. -End note]

Che ne dici degli operandi giusti?

Le parole “rvalue” e “lvalue” non si verificano più nell’intera sezione 5.17. Mentre la nota nel Paragrafo 3.10 / 1 rende esplicito che gli operatori di assegnazione incorporati si aspettano un prvalore come operando di destra, questo non è esplicitamente menzionato nella Sezione 5.17. Persino la nota finale di 5.17 / 1, che cita le conversioni da lvalue a rvalue, sembra implicare che i rvalues ​​siano attesi in qualche modo (qual è la necessità di una conversione in caso contrario?), Ma le note non sono affatto normative.

Le sezioni relative ad altri operatori, inclusi operatori moltiplicativi e additivi, sono generalmente silenziose sulla categoria di valore dei loro operandi. Non sono riuscito a trovare alcuna “istruzione di default” nello Standard che affermi che, quando non specificato diversamente, gli operandi degli operatori integrati sono valori. Quindi, la domanda.

DOMANDA:

  1. Qual è la categoria di valore dell’operando di destra dell’operatore di assegnazione ; e, più in generale
  2. Come capire la categoria di valore dell’operando di un operatore quando questo non è specificato ? Non è vincolato (significa che qualsiasi categoria di valore è accettata)? In tal caso, perché le conversioni da lvalue a rvalue si applicano mai a un’espressione di assegnazione?

I riferimenti allo standard C ++ 11 sono molto apprezzati.