Conversions implicites en C
Lors de discussions récentes sur les conversions implicites en C, des questions ont été soulevées quant à l'applicabilité de plusieurs conversions en une seule opération. . Pour élucider ce concept, examinons le code suivant :
<code class="cpp">#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>
Comme indiqué initialement, le premier appel de fonction est une erreur car il n'y a pas de conversion directe d'un const char* en un A. Alors qu'une conversion de chaîne en A existe, son utilisation nécessiterait deux conversions consécutives.
Selon la norme C (SC22-N-4411.pdf), section 12.3.4 intitulée « Conversions » :
" Au plus une conversion définie par l'utilisateur (constructeur ou fonction de conversion) est implicitement appliquée à une seule valeur."
Cela implique que dans le code donné, le compilateur ne peut pas implicitement appliquer à la fois le constructeur pour A(const std : :string &) et la conversion implicite de const char* en std::string (qui est ensuite converti en A) en argument "one".
Par conséquent, l'affirmation originale selon laquelle le premier appel de fonction serait entraîner une erreur est correct. La norme C indique explicitement qu'une seule conversion implicite définie par l'utilisateur est autorisée, empêchant le compilateur d'effectuer les étapes nécessaires pour satisfaire le type de paramètre de la fonction.
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!