2013-08-09 6 views
11

std::array in C++ 11 è una classe utile che fornisce un'interfaccia C++ Container su un array stack C.Decisione di progettazione per il riempimento std :: array

Ma perché il std::array non ha il tipico costruttore di riempimento che la maggior parte dei contenitori ha? Invece, ha un metodo fill.

C'è qualche motivo per cui lo std::array è univoco tra i contenitori STL a questo proposito?

+5

Perché altrimenti std :: array non sarebbe più un POD. –

+0

Ho pensato che C++ 11 rilassasse la definizione di POD – Channel72

+7

@ Channel72: POD: * "Una struct POD è una classe non-union che è sia una __trivial class__ che una classe di layout standard [...]" *. classe banale: * "Una classe banale è una classe che ha un costruttore predefinito (12.1), non ha __non-banali costruttori predefiniti__, ed è banalmente copiabile." * Tuttavia, 'std :: array' è un aggregato, e tale seguire regole simili (vedere la risposta di Borgleader). – Zeta

risposta

5

Sì; std::array è pensato per essere un aggregato (C++ 11 §8.5.1) in modo che possa essere utilizzato in quanti più contesti possibili dove può essere utilizzato un array semplice. Un aggregato non può avere costruttori o distruttori espliciti.

6

Dalla sezione 23.3.2.1:

Un array è un aggregato (8.5.1) che può essere inizializzato con la sintassi matrice a = {inizializzatore-list};

Se funzionasse come std::vector non sarebbe più un POD. Inoltre dalla stessa sezione:

Le condizioni per un aggregato (8.5.1) devono essere soddisfatte.

Queste condizioni sono:

Un aggregato è una matrice o una classe (Clausola 9) senza costruttori forniti dall'utente (12.1), senza bretelle-o-equalinitializers per i dati non statico membri (9.2), nessun membro di dati non statici privato o protetto (clausola 11), , nessuna classe di base (clausola 10) e nessuna funzione virtuale (10.3).

3

Ognuno di spiegato il "perché" abbastanza bene credo, quindi mi limiterò a mettere su un suggerimento soluzione alternativa, che dovrebbe compilare per essere altrettanto buono come costruttore origini:

template< typename T, std::size_t n > std::array<T,n> filledArray(const T& v) { 
    std::array<T,n> r; 
    r.fill(v); 
    return r; 
} 

auto arr = filledArray<int,4>(7); 
+0

Hm, qualsiasi motivo per non utilizzare un ciclo for range? Solo curioso. – Zeta

+0

Oppure la funzione membro 'fill'? –

+0

@BenjaminLindley buon punto! – Dave

Problemi correlati