Varios comentarios sobre una respuesta reciente mía, What other useful casts can be used in C++, sugieren que mi comprensión de las conversiones en C++ es incorrecta. Solo para aclarar el problema, considere el siguiente código:C++ conversiones implícitas
#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
}
Mi afirmación es que la primera llamada a la función es un error, becauuse no hay conversión de un const char * a una A. Hay una conversión de una cadena a una A, pero usar esto involucraría más de una conversión. Mi entendimiento es que esto no está permitido, y esto parece ser confirmado por los compiladores de cometa g ++ 4.4.0 &. Con Comeau, me sale el siguiente error:
"ComeauTest.c", line 11: error: no suitable constructor exists
to convert from "const char [4]" to "A"
func("one"); // error
Si se puede señalar, dónde estoy equivocado, ya sea aquí o en la respuesta original, preferentemente con referencia al estándar de C++, por favor hágalo.
Y la respuesta del estándar de C++ parece ser:
At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.
Gracias a Abhay para proporcionar la cita.
Lamento que me haya equivocado en el comentario de su respuesta. Leí "La resolución de sobrecarga se usa para seleccionar la conversión definida por el usuario que se invocará", y me dije a mí mismo 'bueno, luego se resolverá en A (const de cadena &) y pasará' uno '', pero fallé por completo pensar en lo que dice 13.3.3.1.2: "Una secuencia de conversión definida por el usuario consiste en una secuencia de conversión estándar inicial seguida de una conversión definida por el usuario (12.3) seguida de una segunda secuencia de conversión estándar". Pero "uno" -> cadena no sería una secuencia de conversión estándar, sino que requeriría otra secuencia de conversión definida por el usuario. –
siempre y cuando no pierda mis canicas :-) –
¡Gran pregunta! La discusión implica que 'std :: string' no es parte del lenguaje y las conversiones a/desde él son" definidas por el usuario ". Al menos eso es lo que entiendo, corrígeme si me equivoco. Sería bueno si la pregunta fuera más explícita sobre esto. El estado exacto de 'std :: string' puede ser muy claro para las viejas manos de C++, pero no es tan fácil de realizar para las personas que llegaron al idioma en este siglo. –