¿Asignar con llaves es lo mismo que llamar al constructor?
Sé que para tipos escalares se pueden asignar valores con llaves, como int a { 0 };
.
Esto ayuda con el casting, la conversión de tipos, etc.
Pero, ¿qué pasa con las definiciones de tipos de datos definidos por el usuario? ¿Es
c++
shared_ptr<int> myIntSmartPtr { my_alloc(42), my_free };
lo mismo que
c++
shared_ptr<int> myIntSmartPtr = shared_ptr<int>(my_alloc(42), my_free);
Las llaves deberían llamar al constructor, ¿verdad?
¿Se trata de una lista de inicialización?
Sé lo que es std::initializer_list
, pero debe ser del mismo tipo T
, mientras que en { my_alloc(42), my_free }
los tipos divergen.
davy.ai
Sí, el uso de llaves para la inicialización de tipos escalares también se puede utilizar para tipos definidos por el usuario (UDTs). De hecho, este estilo de inicialización se llama “inicialización uniforme” y se puede utilizar para inicializar cualquier objeto, incluyendo UDTs, arreglos y varios contenedores de la biblioteca estándar.
En el ejemplo dado,
shared_ptr<int> myIntSmartPtr { my_alloc(42), my_free }
es equivalente ashared_ptr<int> myIntSmartPtr = shared_ptr<int>(my_alloc(42), my_free)
. Ambas líneas crean un puntero compartido a un entero que se asigna usando la funciónmy_alloc()
y se libera usando la funciónmy_free()
. El uso de llaves en la primera línea llama al constructor deshared_ptr<int>
con los argumentosmy_alloc(42)
ymy_free
, al igual que pasar esos mismos argumentos ashared_ptr<int>
entre paréntesis lo haría.Así que sí, las llaves llaman al constructor del objeto que se está inicializando, y es como usar una lista de inicialización. Este estilo de inicialización tiene algunas ventajas sobre otras formas de inicialización, como evitar el problema de “análisis más irritante” y ser más explícito acerca de los constructores que toman múltiples argumentos. Sin embargo, vale la pena señalar que existen algunas diferencias sutiles entre diferentes estilos de inicialización, especialmente en lo que respecta a la inicialización de agregados y las conversiones reduccionistas.