¿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…)
davy.ai
Para probar si un tipo es inicializable con cero usando la sintaxis
{}
, podemos utilizarstd::is_trivially_default_constructible
, una característica de<type_traits>
. Si esta característica estrue
, entonces el tipo es inicializable con cero: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:Cabe destacar que la característica
std::is_trivially_constructible
incluyestd::is_trivially_default_constructible
, por lo que podemos utilizarla para probar ambas condiciones. En C++17, existe una nueva característica llamadastd::is_nothrow_constructible
que verifica si un tipo se puede construir con una inicialización vacía{}
y la construcción no lanza excepciones:Es importante tener en cuenta que
std::is_trivially_constructible
ystd::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.