Dato uno qualsiasi std::array< T, 0 >
, perché non è vuoto? Intendo "vuoto" come in:Perché lo std :: array < T, 0 > non è vuoto?
std::is_empty< std::array< int, 0 > >::value
ritorno false
e
#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;
}
cede
4
4
8
che significa che per std::array<int,0>
, l'ottimizzazione di base vuoto (EBO) non è applicata .
Questo sembra particolarmente strano per me, dato che std::tuple<>
(nota: nessun parametri di modello) è vuoto, vale a dire, std::is_empty<std::tuple<>>::value
fa cedere true
.
Domanda: Perché che, dato che le dimensioni 0
è già un caso speciale per std::array
? È intenzionale o una svista nello standard?
GCC 4.8 sembra farlo in modo diverso (o libstdC++ venire con esso), poiché 'sizeof (std :: matrice) == 1'. Ma mi rendo conto che hai detto "una * possibile * implementazione" e accetto il ragionamento, quindi grazie! –
GCC fa 'value_type _M_instance [_Nm? _Nm: 1]; 'e vedo' sizeof (array) == sizeof (int) ' –
Vedo' sizeof (std :: array) == 1' per GCC 4.8 su LiveWorkSpace.org. Strano. –