Biorąc pod uwagę dowolny numer std::array< T, 0 >
, dlaczego nie jest on pusty? To znaczy "puste" na przykład:Dlaczego std :: array < T, 0 > nie jest pusty?
std::is_empty< std::array< int, 0 > >::value
powrocie false
i
#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;
}
daje
4
4
8
, co oznacza, że dla std::array<int,0>
optymalizacja pusty podstawy (EBO) nie jest stosowany .
się to wydawać dziwne, zwłaszcza biorąc pod uwagę, że do mnie std::tuple<>
(uwaga: nie ma parametry szablonu) jest pusty, to znaczy std::is_empty<std::tuple<>>::value
robi uzyskując true
.
Pytanie: Dlaczego jest to, że, biorąc pod uwagę wielkość 0
już jest szczególnym przypadkiem dla std::array
? Czy jest to celowe czy też niedopatrzenie w standardzie?
GCC 4.8 wydaje się to zrobić inaczej (lub libstdC++ pochodzących z nim), ponieważ 'sizeof (std :: array) == 1 '. Ale zdaję sobie sprawę, że powiedziałeś "jedno * możliwe * wdrożenie" i akceptuję uzasadnienie, więc dziękuję! –
GCC ma wartość "value_type _M_instance [_Nm? _Nm: 1]; 'i widzę' sizeof (array) == sizeof (int) ' –
Widzę' sizeof (std :: array) == 1' dla GCC 4.8 na LiveWorkSpace.org. Dziwne. –