Bonjour,
Comme vous le savez, bien mieux que moi, il existe diff�rentes fa�ons pour initialiser une variable. Entre autres, int a(0); int a = 0; int a{0}...Ma question, quelle est celle que je dois privil�gier?
Merci et bonne apr�s-midi
Version imprimable
Bonjour,
Comme vous le savez, bien mieux que moi, il existe diff�rentes fa�ons pour initialiser une variable. Entre autres, int a(0); int a = 0; int a{0}...Ma question, quelle est celle que je dois privil�gier?
Merci et bonne apr�s-midi
Bonjour,
Dans le cas d'un type de base que l'on initialise avec une valeur de m�me type, les 4 initialisations sont �quivalentes
On pourrait aussi utiliser auto � la place de int dans le code pr�c�dent.Code:
1
2
3
4
5
6
7 int i1 = 1; // initialisation par copie int i2{2}; // initialisation directe (car 2 et i2 ont le même type) int i3(3); // initialisation directe int i4 = {4}; // initialisation par liste copie // j'en ajoute deux autres pratiques à connaître pour des types complexes à écrire auto i5 = int{5}; // équiv à i2 auto i6 = int(6); // équiv à i3
Si une conversion est n�cessaire et n�cessite une conversion restrictive, les initialisations avec {} ne passeront pas
Si le type destination n�cessite une conversion explicite, ce sont les initialisations avec = qui ne passeront pasCode:
1
2
3
4 int c1 = 1.5; // au mieux un warning //int c2{2.5}; erreur conversion par liste directe restrictive int c3(3.5); // au mieux un warning //int c4 = {4.5}; erreur conversion par liste copie restrictive
Et donc si � la fois la conversion est explicite et n�cessite une conversion restrictive, seule l'initialisation avec les parenth�ses est accept�e. C'est celle qui va prendre tous les risques...Code:
1
2
3
4
5
6
7 struct EInt { explicit EInt( int x ) {} }; //EInt E1 = 1; erreur conversion impossible EInt E2{2}; EInt E3(3); //EInt E4 = {4}; erreur conversion impossible
Alors, laquelle pr�f�rer? Celle qui nous donne le plus de garanties de ne pas faire n'importe quoi. Donc la quatri�me avec = et {}.
Mais attention, s'il existe ces quatre mani�res d'initialiser, c'est que parfois elles se distinguent et, il faut alors utiliser la bonne.
Ici on ne s'est int�ress� qu'au cas o� l'initialisation demandait un unique param�tre. S'il y en a 0 ou bien plusieurs, l'utilisation des {} est aussi celle � pr�f�rer.Code:
1
2
3 std::vector<int> v1{4}; // un tableau d'un élément qui vaut 4 std::vector<int> v2(4); // un tableau de 4 éléments tous nuls std::vector<int> v3 = 4; // ne compile pas
Un grand merci pour cette magistrale r�ponse!
Je vous souhaite une ann�e 2024 constell�e de surprises agr�ables et remplie de rendez-vous avec le bonheur et le succ�s
Jean-Pierre
J'avais fait un tableau sur un autre forum qui montre les diff�rentes formes d'initialisations possible. Depuis C++20 et la possibilit� d'initialiser les membres d'une structure sans avoir de constructeur, les diff�rences en faveur de {} sont la conversion avec perte qui donne une erreur de compilation, les initialisations d�sign�es, le MVP (Most Vexing Parse) qui n'existe pas. Dans le comportement qui diff�re, il y a le traitement de std::initializer_list dans les constructeurs.