J'ai refait ton truc avec un constructeur de copie et en virant les std::flush et les std::endl, parce que d'une part, dans endlil y a déjà un flush, et d'autre part, tu t'intéresses à la sortie standard du programme une fois terminé, alors tu n'as pas besoin de faire un flush à chaque évènement quantique. Du coup c'est moins lourd à lire.
Comme l'indiquait Cyril, une copie est effectuée quand tu invoques true ? A : my_class('C') et pas dans les autres cas. Cette copie est nécessaire pour que les deux arguments de l'opérateur ternaire soient de même type (my_class).
* Dans la ligne précédente, les deux arguments sont déjà du même type (my_class &) et aucune conversion n'est nécessaire ;
* Dans la ligne suivante, une conversion serait nécessaire, mais elle n'a pas lieu parce qu'elle est codée dans la branche false de l'opérateur ternaire ;
* Dans le dernier cas, les deux arguments sont de type (my_class) et aucune conversion n'est nécessaire.
Un collègue sympa a réécrit le code avec des template pour mettre en évidence les types utilisés :
[^] # Re: Indice
Posté par nazcafan . En réponse au message Bizarrerie opérateur ternaire (?:). Évalué à 2. Dernière modification le 11 juin 2020 à 11:33.
L'indice de Cyril t'indique la bonne direction.
J'ai refait ton truc avec un constructeur de copie et en virant les
std::flushet lesstd::endl, parce que d'une part, dansendlil y a déjà unflush, et d'autre part, tu t'intéresses à la sortie standard du programme une fois terminé, alors tu n'as pas besoin de faire unflushà chaque évènement quantique. Du coup c'est moins lourd à lire.Comme l'indiquait Cyril, une copie est effectuée quand tu invoques
true ? A : my_class('C')et pas dans les autres cas. Cette copie est nécessaire pour que les deux arguments de l'opérateur ternaire soient de même type (my_class).* Dans la ligne précédente, les deux arguments sont déjà du même type (
my_class &) et aucune conversion n'est nécessaire ;* Dans la ligne suivante, une conversion serait nécessaire, mais elle n'a pas lieu parce qu'elle est codée dans la branche
falsede l'opérateur ternaire ;* Dans le dernier cas, les deux arguments sont de type (
my_class) et aucune conversion n'est nécessaire.Un collègue sympa a réécrit le code avec des
templatepour mettre en évidence les types utilisés :