En général, j'ai entendu dire que c'est une bonne pratique d'utiliser le mot clé explicit sur les constructeurs avec un seul argument. Cependant, à partir de C++11, les constructeurs avec plus d'un argument peuvent être utilisés pour des conversions implicites. En tant que tel, est-ce une bonne pratique d'appliquer le mot-clé explicit à TOUS les constructeurs de > 0 arguments ?
Réponse
Trop de publicités?La règle générale pour l'explicite est la suivante : voulez-vous que ce constructeur soit appelé implicitement ?
Si oui, ne le rendez pas explicite.
Si non, rendez-le explicite.
Pour les ctors à 1 argument, si la conversion à partir de ce type est aussi sans perte et inoffensive que la conversion d'un ctor à 1 argument. int
à un double
au besoin, rendez-la implicite.
Pour les ctors à >1 argument, déterminez si vous voulez {}
la construction basée sur le travail. C'est parfois une bonne idée, parfois une mauvaise idée.
Dans C++11 et 14, {}
est nécessaire pour renvoyer une valeur à partir d'une fonction lorsque le type ne peut pas être déplacé ou copié. Dans certains cas, vous utiliserez un type de balise pour faire de la {}
plus explicite qu'elle ne le serait autrement si vous voulez éviter les "implicites". {}
usage" pour une raison quelconque.
En C++17, il y a moins de raisons d'avoir vraiment besoin de {}
car les valeurs ne sont plus des objets mais des instructions de construction, ce qui signifie que return T(blah)
ne déplace pas/copie le T
dans une fonction retournant T
mais plutôt une direction qui la construit à partir de blah
.
Quand exactement vous voulez bloquer {}
est une question d'opinion, et ne convient pas à une séance de questions-réponses.