Existe uma maneira de impor a inicialização completa do std :: array
estou usandostd::array<size_t, N>
(N é uma variável de modelo fixa).
#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}}));
}
E isso funciona bem. O problema é que esse outro código é silenciosamente permitido:
A.function({{1,2,3}}));
Ou seja, mesmo com elementos perdidos, oarray
é inicializado de alguma forma, mesmo se estiver bem definido (por exemplo, elementos restantes inicializados em zero, não tenho certeza), essa é uma possível fonte de erros.
Existe uma maneira de impor a inicialização dos elementos extras? Por exemplo. gerando um erro ou um aviso do compilador.
Uma opção que eu contemplava é usarinitializer_list
size_t function2(std::initializer_list<size_t> il){ assert(il.size() == N); ...}
O problema é que isso gerou, na melhor das hipóteses, um erro de tempo de execução e uma verificação em todas as chamadas. Eu preferiria um erro / aviso do compilador.
Não estou muito incomodado com a inicialização padrão dostd::array<>{}
mas peloincompleto inicialização. (Talvez não seja possível fazer nada a respeito, pois isso é herdado do comportamento deT[N]
matriz estática.)
Eu tentei usarclang 3.5
egcc 5
.