Je suis confronté à un problème avec une séquence de conversions définies par l'utilisateur en C++. Consultez le code suivant:Séquence de conversions définies par l'utilisateur en C++
struct A
{
A(int);
};
struct B
{
B(A);
};
struct C
{
C(B);
};
Les constructeurs sont définis quelque part. Maintenant, les énoncés suivants fonctionnent très bien:
A(1); // A <- int
B(1); // B <- A <- int
C(A(1)); // C <- B <- A <- int
C(B(1)); // C <- B <- A <- int
C(B(A(1))); // C <- B <- A <- int
Cependant, lorsque je tente de compiler les éléments suivants:
C(1); // C <- B <- A <- int
que je reçois l'erreur suivante:
error: no matching function for call to ‘C::C(int)’
no known conversion for argument 1 from ‘int’ to ‘B’
Je sais que cette une construction est illégale en C++. Néanmoins, ma question est:
- Comment puis-je le contourner? Je suis à la recherche de solution élégante. Les constructions comme
C(B(A(1)))
sont quelque peu ennuyantes.
Pour être complet, j'ai trouvé plusieurs questions connexes (par exemple, Why user-defined conversions are limited?). Cependant, aucun ne répond à ma question.
Dans les mots de l'homme araignée, [tout le monde obtient une seule (conversion définie par l'utilisateur)] (https://www.youtube.com/watch?v=FYZfNZbn0SU) – NathanOliver
le nombre de conversions possibles serait croître de façon exponentielle avec le nombre de types impliqués si cela était autorisé – user463035818
Quant à la première question, ce n'est pas tellement que les choses vont se casser, mais ce code serait beaucoup plus difficile à comprendre. Si deux conversions définies par l'utilisateur étaient autorisées, il y aurait ** beaucoup plus de ** séquences de conversion possibles, impliquant parfois des types qui ne sont pas directement visibles dans votre code. –