2015-03-08 10 views
6

Was bedeutet es, , Array der Größe Null zu haben?Std :: Array der Größe Null

Ich habe dies in SO durch ähnliche Fragen gegangen vor der Veröffentlichung, und all diese Fragen in Bezug auf einfachen Array-Typ und für C-Sprache und die meisten von ihnen sagen, dass es illegal ist. Aber in C++ ist array<int,0> erlaubt.

Wie pro cppreference.com

Es ist ein Spezialfall für einen Null-Länge-Array (N == 0). In diesem Fall ist array.begin() == array.end(), die einige einzigartige Wert ist. Die Auswirkung des Aufrufs von front() oder back() auf ein Array der Größe Null ist undefiniert.

Warum es nicht als illegal definiert?

+7

Weil templated Code von etwas wie diesem profitieren kann. – sbabbi

+2

Warum sollte es illegal sein? Ich wäre ziemlich genervt, wenn ich meinem Code Sonderfälle hinzufügen müsste, um ein Array von null Größe zu vermeiden, anstatt "Array" auf die offensichtliche Weise behandeln zu lassen. –

+0

@MikeSeymour 'int x [0];' * ist * illegal. Ich denke, die Frage ist, warum der Unterschied. – Angew

Antwort

9

Was bedeutet es, std :: array, Array der Größe Null zu haben?

Das gleiche wie zum Beispiel eine leere std::vector oder eine leere std::set.

Warum ist es nicht als illegal definiert?

Es ist wünschenswert, um es legal, weil es bedeutet, generische Programmierung keinen Sonderfall behandeln muss, wenn die std::array ‚s Größe das Ergebnis einer Kompilierung-Berechnung ist.

Es ist möglich es als legal dank Template-Spezialisierung zu definieren. Zum Beispiel ist die Implementierung, die mit Visual C++ kommt spezialisiert std::array in einer Art und Weise ähnlich den folgenden:

template<class T> 
class array<T, 0> // specialisation 
{ 
    // ... 

    size_type size() const 
    { 
     return 0; 
    } 

    T elements[1]; // the raw array cannot have a size of 0 
}; 

Ich nehme an jedem Compiler implementiert std::array so.

+0

Template-Spezialisierung wie das? Was unnötige Duplizierung, wir haben den bedingten Operator dafür. – Deduplicator

+2

Das ist eine ziemlich überraschende Implementierung. Die Vorgabe, ein 'T' zu konstruieren, wenn ich nach einem Array von null' T' frage, ist ... ungerade. –

+0

@ T.C: Nun, es ist direkt aus der realen VC-Header-Datei übernommen ... –

2

std :: array wird wie andere Standardcontainer betrachtet, die leer sein können. Die Spezialisierung des mit N gleich Null definiert also einen leeren Container.

+0

Nebenbei ist es * nie * ein leerer Typ aber ... – Deduplicator

Verwandte Themen