2013-08-09 22 views
11

std::array w C++ 11 jest użyteczną klasą zapewniającą interfejs kontenera C++ na macierzy stosu C.Decyzja projektowa dotycząca std :: array fill

Ale dlaczego std::array nie ma typowego konstruktora wypełnienia, który ma większość kontenerów? Zamiast tego ma metodę fill.

Czy jest jakiś powód, dla którego std::array jest unikalny wśród kontenerów STL w tym zakresie?

+5

Bo inaczej std :: array nie byłby już POD. –

+0

Myślałem, że C++ 11 rozluźniło definicję POD – Channel72

+7

@ Channel72: POD: * "Struktura POD jest klasą niezłączną, która jest klasą __trivial__ i klasą standardowego layoutu [...]" *. trywialna klasa: * "Klasa trywialna jest klasą, która ma domyślny konstruktor (12.1), nie ma __nie-trywialnych domyślnych konstruktorów__, i jest trywialnie kopiowalna." * Jednak 'std :: array' jest agregatem, a takie mają przestrzegać podobnych zasad (patrz odpowiedź Borgleadera). – Zeta

Odpowiedz

5

Tak; std::array ma być agregatem (C++ 11 §8.5.1), tak aby mógł być użyty w jak największej liczbie kontekstów, w których można użyć zwykłej tablicy. Agregat może nie mieć wyraźnych konstruktorów lub destruktorów.

6

Z sekcji 23.3.2.1:

tablica jest agregat (8.5.1), który może być inicjowany składnia tablicy A = {inicjatora-list};

Jeśli to zadziałało jak std::vector to nie byłby już POD. Dodatkowo z tej samej sekcji:

Warunki dla kruszywa (8.5.1) muszą zostać spełnione.

te warunki są następujące:

Agregat jest tablicą lub klasy (Rozdział 9) bez konstruktorów dostarczane przez użytkowników (12,1), bez usztywniających-lub-equalinitializers dla danych niestatycznych członkowie (9.2), brak prywatnych lub chronionych niestatycznych członków danych (klauzula 11), brak klas bazowych (klauzula 10) i brak funkcji wirtualnych (10.3).

3

Wszyscy wyjaśnić „dlaczego” całkiem dobrze myślę, więc ja po prostu umieścić na sugestię obejścia który powinien skompilować się tak dobrze, jak native konstruktora:

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, jakikolwiek powód, dla którego nie używasz pętli for-range? Po prostu ciekawy. – Zeta

+0

Lub funkcji członka wypełnienia? –

+0

@BenjaminLindley dobry punkt! – Dave

Powiązane problemy