Pourquoi le premier retourne-t-il une référence?
int x = 1;
int y = 2;
(x > y ? x : y) = 100;
Alors que le second ne fonctionne pas?
int x = 1;
long y = 2;
(x > y ? x : y) = 100;
En fait, le second n'a pas compilé du tout - "pas la valeur restante de l'affectation".
Réponses:
Les expressions n'ont pas de types de retour, elles ont un type et - comme cela est connu dans la dernière norme C ++ - une catégorie de valeur.
Une expression conditionnelle peut être une lvalue ou une rvalue . C'est sa catégorie de valeur. (Il s'agit en quelque sorte d'une simplification,
C++11
car nous avons lvalues, xvalues et prvalues.)En termes très larges et simples, une lvalue fait référence à un objet en mémoire et une rvalue est juste une valeur qui ne peut pas nécessairement être attachée à un objet en mémoire.
Une expression d'affectation attribue une valeur à un objet de sorte que la chose à affecter doit être une valeur l .
Pour qu'une expression conditionnelle (
?:
) soit une valeur l (encore une fois, en termes larges et simples), les deuxième et troisième opérandes doivent être des valeurs l du même type . En effet, le type et la catégorie de valeur d'une expression conditionnelle sont déterminés au moment de la compilation et doivent être appropriés, que la condition soit vraie ou non. Si l'un des opérandes doit être converti en un type différent pour correspondre à l'autre, alors l'expression conditionnelle ne peut pas être une valeur l car le résultat de cette conversion ne serait pas une valeur l .la source
an rvalue is just a value that may not necessarily be *attached* to an object in memory.
Pouvez-vous expliquer cela en termes plus simples? . Et que voulez-vous dire par làtype and value *category*
? Merciprvalue, xvalue, glvalue
sont des catégories de valeurs.true
,this
, lesenum
valeurs. Ces choses sont des valeurs (valeurs "pures"), mais ne vivent pas en mémoire.Le type de l'
?:
expression ternaire est le type commun de ses deuxième et troisième arguments. Si les deux types sont identiques, vous obtenez une référence. S'ils sont convertibles entre eux, l'un est choisi et l'autre est converti (promu dans ce cas). Comme vous ne pouvez pas renvoyer une référence lvalue à une variable temporaire (la variable convertie / promue), son type est un type valeur.la source
Il ne peut pas renvoyer une valeur l car il devra implicitement promouvoir le type de
x
pour correspondre au type dey
(puisque les deux côtés de:
ne sont pas du même type), et avec cela il doit créer un temporaire.Que dit la norme? ( n1905 )
Expressions 5.17 Opérateurs d'affectation et d'affectation composée
la source