URL: https://linuxfr.org/forums/programmation-c/posts/bizarrerie-operateur-ternaire Title: Bizarrerie opérateur ternaire (?:) Authors: Claude SIMON Date: 2020年06月10日T20:49:23+02:00 License: CC By-SA Tags: c++, opérateur_ternaire et destructeur Score: 2 Je suis tombé sur un comportement concernant l'opérateur ternaire C++ (`?:`) qui (me) semble bizarre. Il est peut-être tout à fait normal, compte tenu que trois compilateurs différents ont le même comportement, mais je ne trouve pas d'explication satisfaisante. Il porte sur le passage, en tant que paramètres d'un opérateur ternaire, d'un objet déjà instancié, et de l'instanciation à la volée d'un objet du même type. Le destructeur de l'objet déjà instancié est appelé à priori sans que cela ai lieu d'être. Voici le source d'un programme mettant ce comportement en exergue : ```C++ #include class my_class { protected: char c_; public: my_class(char c) { c_ = c; std::cout << "Ctor: " << c_ << std::endl << std::flush; } ~my_class() { std::cout << "Dtor: " << c_ << std::endl << std::flush; } }; #define M(e)\ std::cout << std::endl << "true ? " << #e << std::endl << std::flush;\ (true ? e) int main() { my_class A('A'), B('B'); M(A : B); M( A : my_class('C') ); M( my_class('D') : A ); M( my_class('E') : my_class('F') ); std::cout << std::endl << "End" << std::endl << std::flush; } ``` Voici le résultat de ce programme. On y voit les paramètres de l'opérateur ternaire, et les éventuels appels aux constructeurs et/ou aux destructeurs. Le texte ***en gras et italique*** est de mon fait, pour signaler là où je vois un problème.> Ctor: A> Ctor: B>> true ? A : B>> true ? A : my_class('C')> Dtor: A ***--> Pourquoi le destructeur de l'objet `A` est-il appelé ?***>> true ? my_class('D') : A> Ctor: D> Dtor: D>> true ? my_class('E') : my_class('F')> Ctor: E> Dtor: E>> End> Dtor: B> Dtor: A Si vous voulez constater ce comportement de visu, il suffit de suivre ce lien : https://repl.it/@AtlasTK/C-bug

AltStyle によって変換されたページ (->オリジナル) /