2015-02-13 2 views
7

Die folgenden Werke:Ist es möglich, ein std :: Array von unbenannten Strukturen zu initialisieren?

struct 
{ 
    int v; 
} vals[] = { {1}, {2} }; 

Kann ich das gleiche tun, sondern eine std::array initialisieren?

bearbeiten, da so viele Leute fragen, ‚warum‘

Es gibt einige sehr offensichtliche Abhilfen (in den Kommentaren aufgeführt), aber ich möchte nur einmal die Art verwenden, so dass ich nicht wirklich wollen Es wurde meinem aktuellen Namensraum hinzugefügt. Ich könnte ein Tupel oder etwas Ähnliches verwenden, aber die genannten Werte verbessern die Übersichtlichkeit. Ich brauche den C-Array-Wert nicht, wenn ich eine konstruiere, also kann ich declltype nicht verwenden.

Die sauberste Lösung, die ich tun möchte, ist:

struct 
{ 
    int v; 
} std::array vals = { {1}, {2} }; 

Es ist ein Element von akademischem Interesse als auch - „ist dies möglich, in irgendeiner Weise, die ich nicht hatte obwohl?“. Scheint, wie nicht, ich werde so wahrscheinlich verwenden:

struct 
{ 
    int v; 
} c_array[] = {}; 

std::array<std::remove_reference_t<decltype(c_array[0])>, 2> arr = { {1}, {2} }; 
+0

Haben Sie versucht, 'array '? –

+2

@MatsPetersson Das wird nicht funktionieren. –

+4

'struct {int v; } foo; std :: array bar = {{{1}, {2}}}; '? Aber ... warum musst du das tun? –

Antwort

4

Der Grund, warum Sie nicht tun können:

§7.1:

std::array<struct {int v}, 10> arr; 

wegen der folgenden Regel aus N4140 ist 0,6/3 [...] ein Typ-Spezifizierer-seq soll nicht eine Klasse oder Aufzählung definieren, wenn sie in dem Typ-ID erscheinen ein Alias-Deklaration (7.1.3) Das ist nicht die Deklaration einer Vorlage Deklaration.

Da ein Argument Vorlagentyp angegeben wird eine Typ-ID verwendet wird, und ein Typ-ID enthält ein Typ-Spezifizierer-Seq, kann es nicht die Definition einer Klasse sein.

Sie ein typedef verwenden könnte, aber:

§9.1/5 A typedef-name (7.1.3) mit dem Namen einer Klasse-Typ oder ein cv qualifizierte Version davon ist auch a Klassenname. [...]

ich mit dem Vorschlag von T.C. gehen würde:

struct { int v; } foo; std::array<decltype(foo), 10> bar = {{{1},{2}}}; 
+2

Diese Ausnahme bezieht sich auf 'using T = struct {int v; }; '- eine * Alias-Deklaration *, die nicht Teil einer Alias-Template-Deklaration ist. Der Grund ist, dass sie eine exakte Übereinstimmung zwischen 'using's und' typedef's wollten. –

Verwandte Themen