Pourquoi les types d'expression ont-ils changé en C ++ entre les versions?

13

J'essaie de comprendre les types d'expression de C ++ et plus je lis, plus je suis confus, car je trouve le brouillon C ++ très difficile à digérer et préfère donc d'autres ressources mais elles se contredisent ou ne tiennent pas compte du fait que le la formulation et la définition entre les versions C ++ changent considérablement.

Dans ce qui suit, je me réfère aux projets suivants:

  • C ++ 11 [ n3690 ] (version finale)
  • C ++ 17 [ n4659 ] (version finale)
  • C ++ 20 [ n4835 ] (version actuelle)

C++11 3.10 Lvalues ​​et rvalues

... Une valeur pr (valeur "pure") est une valeur r qui n'est pas une valeur x. [Exemple: Le résultat de l'appel d'une fonction dont le type de retour n'est pas une référence est une valeur. La valeur d'un littéral tel que 12, 7.3e5 ou true est également une valeur. - fin exemple]

C++17 3.10 Lvalues ​​et rvalues

... Une valeur est une expression dont l'évaluation initialise un objet ou un champ de bits, ou calcule la valeur de l'opérande d'un opérateur, comme spécifié par le contexte dans lequel elle apparaît.

C++20 7.2.1 Catégories de valeurs *

... Une valeur est une expression dont l'évaluation initialise un objet ou un champ binaire, ou calcule la valeur d'un opérande d'un opérateur, comme spécifié par le contexte dans lequel elle apparaît, ou une expression de type cv void.

Je comprendrais les changements de formulation, et certains ajustements sont apportés, mais pour moi, la définition entière change. Quelqu'un peut-il m'aider à comprendre cela? Par exemple, pourquoi la phrase a-t-elle été supprimée selon laquelle une prvalue est une rvalue qui n'est pas une xvalue? Ou pourquoi l'exemple utile a-t-il été supprimé?

Daniel Stephens
la source
3
Je suis tout à fait d'accord pour interdire les balises de langue spécifiques à la version. Sauf pour exactement ce genre de questions.
curiousguy
" ne tenez pas compte du fait que la formulation et la définition entre les versions C ++ changent fortement. " Mais la définition n'a pas vraiment changé. À peu près l'expression qui était une valeur en C ++ 11 est toujours une valeur en C ++ 20.
Nicol Bolas
Où est le «contradict (ion)» entre les versions? Quelle est votre question exactement?
Galigator
1
Désolé pour le changement C ++ 20 , mais j'avais remarqué une incohérence dans la norme.
Maggyero

Réponses:

5

La définition de valeur d'origine n'était qu'une étiquette: nous avons mis de côté certaines valeurs (à savoir celles qui ne sont pas des valeurs x) et leur avons donné un nom. Il est impossible de prendre leur adresse sauf via une thisutilisation inhabituelle (plus ou moins parce qu'ils sont temporaires), donc certaines libertés peuvent être prises avec leur création et leur propagation sans rien casser. (Voir également une discussion récente sur le fait qu'ils «n'ont pas d'identité».)

La nouvelle définition dit explicitement qu'une valeur est une initialisation «en attente de se produire»: une fois qu'un objet cible est identifié pour lui, c'est ce qui est initialisé. (Il est important de noter que l'initialisation se produit toujours lorsque la valeur est construite, mais pas là où elle se trouve.) Cela s'appelle «élision de copie obligatoire» en fonction de l'optimisation équivalente qui était déjà courante.

Quant à l'exemple, les nouvelles définitions des catégories de valeurs ont été jugées tellement plus simples que moins d'exemples étaient nécessaires. Il en reste une pour les valeurs x (qui sont la catégorie la plus subtile).

Davis Herring
la source
Merci à vous et aux commentateurs! Cela l'explique à peu près!
Daniel Stephens