Gibt es eine Möglichkeit, die vollständige Initialisierung von std :: array @ zu erzwinge

Ich benutzestd::array<size_t, N> (N ist eine feste Template-Variable).

#include<array>
template<size_t N>
struct A{
   size_t function(std::array<size_t, N> arr){ return arr[N-1];} // just an example
};

int main(){
   A<5> a;
   a.function({{1,2,3,4,5}}));
}

Und es funktioniert gut. Das Problem ist, dass dieser andere Code unbemerkt erlaubt ist:

   A.function({{1,2,3}}));

Das ist, auch bei fehlenden Elementen diearray wird irgendwie initialisiert, auch wenn es gut definiert ist (z. B. verbleibende Elemente werden auf Null initialisiert, ich bin nicht sicher), dies ist eine mögliche Fehlerquelle.

Gibt es eine Möglichkeit, die Initialisierung der zusätzlichen Elemente zu erzwingen? Z.B. durch Generieren eines Compilerfehlers oder einer Warnung.

Eine Option, die ich in Betracht gezogen habe, ist die Verwendung voninitializer_list

   size_t function2(std::initializer_list<size_t> il){ assert(il.size() == N); ...}

Das Problem ist, dass dies bestenfalls einen Laufzeitfehler und ein Einchecken bei jedem Aufruf erzeugt hat. Ich würde einen Compilerfehler / eine Warnung vorziehen.

Die Standardinitialisierung von @ stört mich nicht so sestd::array<>{} aber durch dasunvollständi Initialisierung. (Vielleicht kann nichts dagegen unternommen werden, da dies vom Verhalten von @ geerbt wirT[N] static array.)

Ich habe versucht mitclang 3.5 undgcc 5.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage