Conversions implicites C : comprendre les règles de conversion définies par l'utilisateur
À la lumière des commentaires récents sur une réponse précédente, il est essentiel de clarifier la compréhension de conversions implicites en C .
Considérez l'extrait de code suivant :
<code class="c++">#include <string> struct A { A(const std::string &s) {} }; void func(const A &a) { } int main() { func("one"); // error func(A("two")); // ok func(std::string("three")); // ok }</code>
Le premier appel de fonction entraîne une erreur car il n'y a pas de conversion directe d'un const char* en un A. Bien qu'il existe une conversion d'une chaîne en A, l'appliquer nécessiterait plusieurs conversions, ce qui n'est pas autorisé.
La norme C (SC22-N-4411.pdf) fournit la réponse dans la section 12.3.4. intitulé « Conversions » :
"4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value."
Cela signifie qu'une seule conversion implicite définie par l'utilisateur (soit un constructeur, soit une fonction de conversion) peut être appliquée à une seule valeur lors des conversions de type implicites ou de l'initialisation.
Dans le code donné, le premier appel de fonction, func("one"), tente d'utiliser une conversion implicite du const char* "one" en A, mais il échoue car cela nécessite deux conversions (une de const char * à std :: string, et un autre de std :: string à A). Les deux autres appels de fonction sont valides car ils n'impliquent chacun qu'une seule conversion implicite.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!