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.

¿Rasgo C++ para “no tiene constructores” O rasgo para “es inicializable a cero”?

El sitio web cppreference menciona acerca de la inicialización con cero:

La inicialización con cero se realiza en las siguientes situaciones:

2) Como parte de una secuencia de inicialización de valor para tipos no-clase y para miembros de tipos de clase inicializados por valor que no tienen constructores, …

¿Qué rasgo o combinación de rasgos puedo utilizar para comprobar si:
* el tipo se puede inicializar con cero usando {}, o
* el tipo de clase no tiene “constructores”
* (lo cual creo significa que no tiene constructores definidos por el usuario?)

(P.S. Etiqueté C++11 para indicar que cualquier enfoque de “C++ moderno” es aceptable; también etiqueté C++17 para indicar que la última versión de C++ que me interesa para una respuesta.)

(P.P.S. Sé que cppreference no es el estándar, pero casi siempre es correcto. Si no es correcto en este caso, eso debería formar parte de la respuesta…)

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para probar si un tipo es inicializable con cero usando la sintaxis {}, podemos utilizar std::is_trivially_default_constructible, una característica de <type_traits>. Si esta característica es true, entonces el tipo es inicializable con cero:

    #include <type_traits>
    
    static_assert(std::is_trivially_default_constructible<int>::value);
    

    Para probar si un tipo de clase no tiene “constructores” (es decir, no tiene constructores definidos por el usuario), podemos utilizar la característica std::is_trivially_constructible con el mismo enfoque:

    #include <type_traits>
    
    class MyClass {
    public:
        int x;
    };
    
    static_assert(std::is_trivially_constructible<myclass>::value);
    

    Cabe destacar que la característica std::is_trivially_constructible incluye std::is_trivially_default_constructible, por lo que podemos utilizarla para probar ambas condiciones. En C++17, existe una nueva característica llamada std::is_nothrow_constructible que verifica si un tipo se puede construir con una inicialización vacía {} y la construcción no lanza excepciones:

    #include <type_traits>
    
    class MyClass {
    public:
        int x;
    };
    
    static_assert(std::is_nothrow_constructible<myclass>::value);
    

    Es importante tener en cuenta que std::is_trivially_constructible y std::is_trivially_default_constructible se basan en la definición específica de la implementación de lo que significa ser un constructor “trivial”. Sin embargo, para la mayoría de los propósitos prácticos, estas características deberían comportarse según lo esperado según la definición de inicialización cero de cppreference.

Comments are closed.