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é?
Réponses:
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
this
utilisation 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).
la source