¿Vacío como tipo literal?

En C ++ 14 void es un tipo literal

Un tipo es un tipo literal si es:

– vacío o

– un tipo escalar; o

– un tipo de referencia; o

– una matriz de tipo literal; o

– un tipo de clase (Cláusula 9) que tiene todas las propiedades siguientes: – tiene un destructor trivial,

– es un tipo agregado (8.5.1) o tiene al menos un constructor constexpr o plantilla de constructor que no es un constructor de copia o movimiento, y

– todos sus miembros de datos no estáticos y clases base son de tipos literales no volátiles.

En C ++ 11 void no es un tipo literal

Un tipo es un tipo literal si es:

– un tipo escalar; o

– un tipo de referencia que se refiere a un tipo literal; o

– una matriz de tipo literal; o

– un tipo de clase (Cláusula 9) que tiene todas las propiedades siguientes: – tiene un destructor trivial,

– cada llamada de constructor y expresión completa en los inicializadores de corsé o igual para miembros de datos no estáticos (si los hay) es una expresión constante (5.19),

– es un tipo agregado (8.5.1) o tiene al menos un constructor constexpr o plantilla de constructor que no es un constructor de copia o movimiento, y

– todos sus miembros de datos no estáticos y clases base son de tipos literales.

Entonces, ¿por qué se void un tipo literal? ¿Qué beneficios ofrece?

Como void es de literal type , constexpr funciones constexpr pueden tener un tipo de retorno void en C ++ 14.

Está cubierto en esta propuesta.

Cita de la propuesta:

Se permite una expresión-expresión arbitraria, para permitir llamadas a funciones que realizan comprobaciones y para permitir construcciones de tipo aserción. void también se convierte en un tipo literal, por lo que las funciones constexpr que existen solo para realizar dichas comprobaciones pueden devolver void.

 #define ASSERT(expr) \ (void)((expr) || assert_failed(#expr, __LINE__, __FILE__)) void assert_failed(...); // not constexpr struct S { std::array a; size_t i; constexpr void check_invariants() const { ASSERT(i < a.size()); ASSERT(a[i] == 0); } S(std::array a_, size_t i_) : a(a_), i(i_) { check_invariants(); } };