¿Hay alguna manera de exigir la inicialización completa de std :: array
estoy usandostd::array<size_t, N>
(N es una variable de plantilla fija).
#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}}));
}
Y funciona bien. El problema es que este otro código se permite silenciosamente:
A.function({{1,2,3}}));
Es decir, incluso con elementos perdidos, elarray
se inicializa de alguna manera, incluso si está bien definido (por ejemplo, los elementos restantes inicializados a cero, no estoy seguro), esta es una posible fuente de errores.
¿Hay alguna manera de hacer cumplir la inicialización de los elementos adicionales? P.ej. generando un error del compilador o una advertencia.
Una opción que contemplé es usarinitializer_list
size_t function2(std::initializer_list<size_t> il){ assert(il.size() == N); ...}
El problema es que esto generó un error de tiempo de ejecución en el mejor de los casos y un control en cada llamada. Preferiría un error / advertencia del compilador.
No me molesta tanto la inicialización predeterminada destd::array<>{}
pero por elincompleto inicialización (Tal vez no se pueda hacer nada al respecto, ya que esto se hereda del comportamiento deT[N]
matriz estática).
Traté de usarclang 3.5
ygcc 5
.