Perché i tipi di espressione sono cambiati in C ++ tra le versioni?


13

Cerco di comprendere i tipi di espressione di C ++ e più leggo, più sono confuso, poiché trovo la bozza di C ++ molto difficile da digerire e quindi preferisco altre risorse ma si contraddicono a vicenda o non tengono conto del fatto che il la formulazione e la definizione tra le versioni C ++ cambiano pesantemente.

Di seguito mi riferisco alle seguenti bozze:

  • C ++ 11 [ n3690 ] (bozza finale)
  • C ++ 17 [ n4659 ] (bozza finale)
  • C ++ 20 [ n4835 ] (bozza corrente)

C++11 3.10 Valori e valori

... Un valore (valore "puro") è un valore che non è un valore x. [Esempio: il risultato della chiamata di una funzione il cui tipo restituito non è un riferimento è un valore. Anche il valore di un valore letterale come 12, 7.3e5 o true è un valore. - fine esempio]

C++17 3.10 Valori e valori

... Un valore è un'espressione la cui valutazione inizializza un oggetto o un campo di bit o calcola il valore dell'operando di un operatore, come specificato dal contesto in cui appare.

C++20 7.2.1 Categorie di valori *

... Un valore è un'espressione la cui valutazione inizializza un oggetto o un campo di bit o calcola il valore di un operando di un operatore, come specificato dal contesto in cui appare, o un'espressione che ha tipo cv void.

Comprenderei le modifiche alla formulazione e vengono apportate alcune modifiche, ma per me l'intera definizione cambia. Qualcuno può aiutarmi a capirlo? Ad esempio, perché è stata rimossa la frase che un valore è un valore che non è un valore x? O perché l'esempio utile è stato rimosso?


3
Sono tutto per il divieto di tag di lingua specifici della versione. Tranne esattamente questo tipo di domande.
curiousguy


" non tenere conto del fatto che la formulazione e la definizione tra le versioni di C ++ cambiano fortemente. " Ma la definizione non è cambiata davvero. Praticamente un'espressione che era un valore in C ++ 11 è ancora un valore in C ++ 20.
Nicol Bolas,

Dov'è la "contraddizione (ione)" tra la versione? Qual è esattamente la tua domanda?
Galigator,

1
Ci scusiamo per il cambio C ++ 20 , ma avevo notato un'incoerenza nello standard.
Maggyero,

Risposte:


5

La definizione del valore originale era solo un'etichetta: mettiamo da parte alcuni valori (vale a dire quelli che non sono xvalori) e diamo loro un nome. È impossibile prendere il loro indirizzo se non tramite un thisuso insolito (più o meno perché sono temporanei), quindi alcune libertà possono essere prese con la loro creazione e propagazione senza rompere nulla. (Vedi anche una recente discussione sul fatto che non "hanno identità".)

La nuova definizione afferma esplicitamente che un valore è un'inizializzazione "in attesa di accadere": una volta identificato un oggetto target, è ciò che viene inizializzato. (È importante notare che l'inizializzazione avviene ancora quando viene costruito il valore, ma non dove si trova.) Questo prende il nome di "elision copia obbligatoria" in base all'ottimizzazione equivalente che era già comune.

Per quanto riguarda l'esempio, le nuove definizioni delle categorie di valori sono state considerate molto più semplici da rendere necessari meno esempi. Ce n'è ancora uno per xvalues ​​(che sono la categoria più sottile).


Grazie a te e ai commentatori! Questo lo spiega praticamente!
Daniel Stephens,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.