Plusieurs commentaires sur une réponse récente, What other useful casts can be used in C++, suggèrent que ma compréhension des conversions C++ est défectueuse. Juste pour clarifier la question, considérez le code suivant:Conversions implicites 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
}
Mon affirmation est que le premier appel de fonction est une erreur, becauuse il n'y a pas de conversion à partir d'un const char * à un A. Il y a une conversion de une chaîne à un A, mais l'utiliser impliquerait plus d'une conversion. Ma compréhension est que cela n'est pas autorisé, et cela semble être confirmé par g ++ 4.4.0 & Comeau compilateurs. Avec Comeau, je reçois l'erreur suivante:
"ComeauTest.c", line 11: error: no suitable constructor exists
to convert from "const char [4]" to "A"
func("one"); // error
Si vous soulignez, où je me trompe, que ce soit ici ou dans la réponse initiale, de préférence en référence à la norme C++, s'il vous plaît le faire.
Et la réponse de la norme C semble être de:
At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.
Merci à Abhay pour fournir le devis.
Je suis désolé j'ai eu tout faux dans le commentaire à votre réponse. J'ai lu "La résolution de surcharge est utilisée pour sélectionner la conversion définie par l'utilisateur à invoquer.", Et je me suis dit "bien, alors il se résoudra à A (chaîne const &) et passera" un ", mais j'ai totalement échoué pour penser à ce que 13.3.3.1.2 dit: "Une séquence de conversion définie par l'utilisateur consiste en une séquence de conversion standard initiale suivie d'une conversion définie par l'utilisateur (12.3) suivie d'une seconde séquence de conversion standard." Mais "one" -> chaîne ne serait pas une séquence de conversion standard, mais nécessite une autre séquence de conversion définie par l'utilisateur! –
Tant que je ne perds pas mes billes :-) –
Bonne question! La discussion implique que 'std :: string' ne fait pas partie du langage et que les conversions vers/depuis lui sont" définies par l'utilisateur ". Au moins c'est ce que je comprends, corrigez-moi si je me trompe. Ce serait bien si la question était plus explicite à ce sujet. Le statut exact de 'std :: string' peut être clair pour les anciennes mains C++, mais n'est pas si facile à réaliser pour les personnes qui sont venues à la langue dans ce siècle. –