Comportamiento diferente entre conversión explícita, inicialización directa e inicialización de copia
Tengo una claseC
que tiene un operador de casting para cualquier cosa. En el ejemplo intenté enviar una instancia destd::string
de tres maneras diferentes:static_cast
, constructor destd::string
y asignando astd::string
. Sin embargo, solo el último se compila, mientras que los otros generan un error de constructor ambiguo.
La razón del error es bastante clara: hay muchas formas de convertirC
a algo que el constructor destd::string
poder aceptar. Pero, ¿cuál es la diferencia entre estos casos? ¿Por qué el operador de reparto funciona como se pretende aquí pero no allí?
struct C {
template<typename T>
operator T() const {
return T{};
}
};
int main() {
C c;
cout << static_cast<string>(c) << endl; // compile error
string bad(c); // compile error
string ok = c; // compiles successfully
}
UPD: como bolov mencionó en los comentarios, este problema no se reproduce con C ++ 17. Lo probé con g ++ - 5 y clang-3.8 con -std = c ++ 11 y -std = c ++ 14, y muestra los errores descritos.