Maison >développement back-end >C++ >Pourquoi C n'autorise-t-il qu'une seule conversion définie par l'utilisateur lors des conversions de type implicites ?

Pourquoi C n'autorise-t-il qu'une seule conversion définie par l'utilisateur lors des conversions de type implicites ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-01 01:14:28616parcourir

Why Does C   Allow Only One User-Defined Conversion During Implicit Type Conversions?

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!

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