2013-03-20 4 views
20

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?

risposta

21

La norma non dice nulla sul fatto tuple o array dovrebbe essere vuoto, quello che stai vedendo sono dettagli di implementazione, ma non c'è alcun motivo per fare tuple<> non vuoto, considerando che v'è una buona ragione per non essere array<T, 0> -empty, prendere in considerazione:

std::array<int, sizeof...(values)> = { { values... } }; 

Quando il parametro confezione è vuota si otterrebbe:

std::array<int, 0> = { { } }; 

per l'inizializzazione sia valida l'oggetto ha bisogno di un membro, che non può essere int[0] perché non si può avere matrici di dimensioni zero, come membri, così una possibile implementazione è int[1]

Un'implementazione non deve caso speciale l'intera matrice, può semplicemente fare:

T m_data[N == 0 ? 1 : N]; 

e tutti gli altri membri funzionano esattamente nello stesso modo (supponendo end() è definito come begin()+N)

+0

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! –

+0

GCC fa 'value_type _M_instance [_Nm? _Nm: 1]; 'e vedo' sizeof (array ) == sizeof (int) ' –

+0

Vedo' sizeof (std :: array ) == 1' per GCC 4.8 su LiveWorkSpace.org. Strano. –

Problemi correlati