es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  ,

Answer

  1. Avatar for 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 a shared_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ón my_alloc() y se libera usando la función my_free(). El uso de llaves en la primera línea llama al constructor de shared_ptr<int> con los argumentos my_alloc(42) y my_free, al igual que pasar esos mismos argumentos a shared_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.

Comments are closed.