Conversions implicites C : Clarification
Récemment, des commentaires sur une réponse précédente concernant les conversions alternatives en C ont suscité des questions sur l'exactitude des conversions implicites . Pour apporter des éclaircissements, nous examinerons le segment de code suivant :
#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 }
À l'origine, il a été affirmé que le premier appel de fonction entraînait une erreur car aucune conversion directe n'existe d'un const char * vers un A. Cependant , il y a une conversion d'une chaîne en A. L'utilisation de cette conversion impliquerait plus d'une étape, ce qui est généralement interdit. Cette affirmation est soutenue par les compilateurs g 4.4.0 et Comeau.
Après une enquête plus approfondie, le standard C (12.3.4) fait la lumière sur cette question, déclarant qu'au plus une conversion définie par l'utilisateur ( constructeur ou fonction de conversion) peut être implicitement appliqué à une seule valeur. Cette décision correspond au comportement observé et clarifie les limites des conversions implicites.
En résumé, une seule conversion implicite définie par l'utilisateur est autorisée sur une seule valeur. Dans le code fourni, l'appel func("one") échoue car il nécessiterait plusieurs conversions implicites, ce qui n'est pas autorisé.
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!