Código [Seleccionar]
struct s {
private:
int x = 0;
public:
s(int _x) : x{ _x } {} // converting constructor: inicializa un s a partir de un int
void p() const { std::cout << x; }
int getx() const { return x; }
};
Estas cuatro expresiones hacen exactamente lo mismo: invocan al "converting constructor".
Código [Seleccionar]
s _s(5); // crea _s a partir del int 5
s _t = 6; // crea _t a partir del int 6
s _u{ 7 }; // crea _u a partir del int 7 (direct-list-initialization a partir de C++11)
s _v = { 8 }; // crea _v a partir del int 8 (copy-list-initialization a partir de C++11)
En este caso las cuatro expresiones construyen e inicializan un objeto de tipo 's' a través del "converting constructor", que es el constructor que especifica la conversión desde el tipo int al tipo s.
En C++98 sólo existían las dos primeras y C++11 introduce las dos últimas, que las llama "uniform initialization", en sus dos variantes, "direct list initialization" y "copy list initialization".
Si observas la salida del programa, se mostrarán los ints 5, 6, 7, y 8 porque esos son los valores con que cada objeto fue inicializado.
Y Si usas el debugger para ejecutar paso a paso el programa, verás que cómo el flujo de ejecución pasa por ese constructor.