En C++ se distingue entre inicialización directa (direct) e inicialización indirecta (copy) de objetos:
Inicialización directa:
MyClass obj(arg1, arg2); int x(5);
Para las clases, se llama directamente al constructor apropiado.
Inicialización indirecta:
MyClass obj = MyClass(arg1, arg2); int x = 5;
Esto crea un objeto temporal y luego lo copia (o lo mueve) (utiliza el constructor de copia/movimiento).
Diferencias:
Ejemplo:
struct NonCopyable { NonCopyable(int) {} NonCopyable(const NonCopyable&) = delete; }; NonCopyable a(5); // OK: inicialización directa NonCopyable b = NonCopyable(5); // OK con optimización, error antes de C++17 sin ella NonCopyable c = 5; // Error: no hay constructor de copia
"¿Puede la inicialización por copia (copy-initialization) provocar más llamadas a constructores que la inicialización directa (direct-initialization), si se utiliza C++11 y se tiene un compilador optimizador activado?"
Respuesta: Teóricamente — sí. Sin la eliminación de copias, la inicialización por copia crea un objeto temporal, luego llama al constructor de copia o de movimiento. La inicialización directa siempre llama solo al constructor principal. Sin embargo, los compiladores modernos con optimización habilitada (C++17 en adelante) eliminan esta diferencia gracias a la eliminación de copias garantizada.
Historia
En un proyecto financiero, se utilizó la inicialización por copia con un objeto temporal, y el tipo necesario no tenía un constructor de copia. La aplicación no se compilaba en compiladores antiguos (antes de C++17), aunque la inicialización directa funcionaba.
Historia
En la utilidad de serialización de datos, los programadores creían que la inicialización directa y la inicialización por copia eran equivalentes. Como resultado, se producían copias innecesarias de grandes estructuras y caídas de rendimiento.
Historia
Al inicializar matrices globales de objetos definidos por el usuario, se utilizó la inicialización indirecta. Los errores solo se manifestaron en una plataforma, donde no se producía la eliminación de copias, y surgieron llamadas implícitas a constructores adicionales debido a las particularidades del ABI.