2013-08-09 15 views
11

in C++ 11 ist eine nützliche Klasse, die eine C++ - Container-Schnittstelle über ein C-Stack-Array bereitstellt.Entwurfsentscheidung in Bezug auf std :: array fill

Aber warum hat nicht den typischen Füllkonstruktor, den die meisten Container haben? Stattdessen hat es eine Methode fill.

Gibt es einen Grund, warum std::array unter STL-Containern in dieser Hinsicht einzigartig ist?

+5

Weil sonst std :: Array wäre kein POD mehr. –

+0

Ich dachte C++ 11 entspannt die Definition von POD – Channel72

+7

@ Channel72: POD: * "Eine POD-Struktur ist eine nicht-Union-Klasse, die eine __trivial Klasse__ und eine Standard-Layout-Klasse [...]" * ist. triviale Klasse: * "Eine triviale Klasse ist eine Klasse, die einen Standardkonstruktor (12.1) hat, keine __nicht-trivialen Standardkonstruktoren__ hat und trivial kopierbar ist." * Allerdings ist 'std :: array' ein Aggregat und ein solches ähnlichen Regeln folgen (siehe Borgleaders Antwort). – Zeta

Antwort

5

Ja; soll ein Aggregat sein (C++ 11 §8.5.1), so dass es in möglichst vielen Kontexten verwendet werden kann, in denen ein einfaches Array verwendet werden kann. Ein Aggregat kann keine expliziten Konstruktoren oder Destruktoren enthalten.

6

Vom Abschnitt 23.3.2.1:

Ein Array ist ein Aggregat (8.5.1), die mit der Syntax Array A initialisiert werden kann = {Initialisierer-Liste};

Wenn es wie std::vector funktionierte, wäre es kein POD mehr. Zusätzlich aus demselben Abschnitt:

Die Bedingungen für ein Aggregat (8.5.1) müssen erfüllt sein.

Diese Bedingungen sind:

ein Aggregat ist, ein Array oder eine Klasse (Abschnitt 9) ohne Benutzer bereitgestellten Konstruktoren (12.1), kein Klammer-or-equalinitializers für nicht-statische Daten Mitglieder (9.2), keine privaten oder geschützten nicht statischen Datenmitglieder (Abschnitt 11), keine Basisklassen (Abschnitt 10) und keine virtuellen Funktionen (10.3).

3

Jeder ist erklärt das „Warum“ ziemlich gut denke ich, so dass ich nur eine Abhilfe Vorschlag setzen, die nur so gut zu sein wie eine native Konstruktor kompilieren sollte:

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, irgendeinen Grund für die Verwendung einer For-Range-Schleife? Nur neugierig. – Zeta

+0

Oder die 'fill' Elementfunktion? –

+0

@BenjaminLindley guter Punkt! – Dave