quel est le résultat (type) d’opération ternaire?

L’opération ternaire renvoie-t-elle une copie ou une référence?

J’ai vérifié le code suivant

vector v0 = { 1, 2 }; vector v1 = { 3 }; vector& v = true ? v0 : v1; v.clear(); // v0 will be cleared also 

Je pense que l’opération ternaire retourne une copie de v0 . Et puis passez à v . Ainsi v et v0 ont un stockage de données différent. Les tests ne le montrent pas.

Merci, Kerrek SB! J’ajoute un exemple “devrait-pas-comstackr” (Merci WhiZTiM!) Pour montrer le point.

 vector& v = true ? v0 : vector{3}; v.clear(); // v0 will not be cleared 

Le type d’une expression conditionnelle est le type commun des opérandes.

Mais je pense que cela ne vous intéresse pas vraiment. Ce qui compte, c’est la catégorie de valeur d’une expression conditionnelle.

Si les deux opérandes sont, ou peuvent être convertis, des valeurs de type commun, l’expression conditionnelle est alors une valeur. sinon, c’est une valeur (nécessitant potentiellement la conversion de valeur en opérande de l’un des opérandes).

Les règles se trouvent ici : pertinentes pour votre expression:

 E1 ? E2 : E3 

4) Si E2 et E3 sont des glvalues du même type et de la même catégorie de valeur, le résultat a le même type et la même catégorie de valeur et constitue un champ de bits si au moins l’un des E2 et E3 est un champ de bits.

Dans ton cas:

 true ? v0 : v1; 

v0 et v1 sont des lvalues (globalement glvalue ). Donc, le retour sera une lvalue v0 . Par conséquent, votre expression sera équivalente à:

 vector& v = v0; 

En ce qui concerne votre édition :

 vector& v = true ? v0 : vector{3}; v.clear(); // v0 will not be cleared 

Ne doit pas comstackr , car la catégorie de valeur du résultat sera une valeur rvalue et vous ne pouvez pas lier une référence non const à une valeur rvalue