Maison >développement back-end >C++ >Les conversions implicites en C peuvent-elles impliquer plusieurs conversions définies par l'utilisateur ?

Les conversions implicites en C peuvent-elles impliquer plusieurs conversions définies par l'utilisateur ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-03 16:49:30533parcourir

Can Implicit Conversions in C   Involve Multiple User-Defined Conversions?

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 &amp; s ) {}
};

void func( const A &amp; 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn