¿Por qué std :: array <T, 0> no está vacío?
Dado cualquierstd::array< T, 0 >
, ¿por qué no está vacío? Me refiero a "vacío" como en:
std::is_empty< std::array< int, 0 > >::value
regresandofalse
y
#include <iostream>
#include <tuple>
#include <array>
struct Empty {};
int main()
{
std::cout << sizeof(std::tuple<int>) << std::endl;
std::cout << sizeof(std::tuple<int,Empty>) << std::endl;
std::cout << sizeof(std::tuple<int,std::array<int,0>>) << std::endl;
}
rendimientos
4
4
8
lo que significa que parastd::array<int,0>
, la optimización de la base vacía (EBO) no se aplica.
Esto me parece especialmente extraño dado questd::tuple<>
(nota: sin parámetros de plantilla)es vacío, es decir,std::is_empty<std::tuple<>>::value
hace rendimientotrue
.
Pregunta: ¿Por qué es eso, dado ese tamaño?0
ya es un caso especial parastd::array
? ¿Es intencional o un descuido en la norma?