Есть ли способ обеспечить полную инициализацию std :: array

я используюstd::array<size_t, N> (N - фиксированная переменная шаблона).

#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}}));
}

И это прекрасно работает. Проблема в том, что этот другой код молча разрешен:

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

То есть даже при пропущенных элементахarray инициализируется каким-либо образом, даже если он хорошо определен (например, оставшиеся элементы инициализированы нулем, я не уверен), это возможный источник ошибок.

Есть ли способ обеспечить инициализацию дополнительных элементов? Например. генерируя ошибку компилятора или предупреждение.

Один вариант, который я рассмотрел, это использоватьinitializer_list

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

Проблема заключается в том, что это в лучшем случае приводило к ошибке времени выполнения и проверке при каждом вызове. Я бы предпочел ошибку / предупреждение компилятора.

Меня не очень беспокоит инициализация по умолчаниюstd::array<>{} но понеполный инициализация. (Может быть, с этим ничего не поделаешь, так как это унаследовано от поведенияT[N] статический массив.)

Я пытался с помощьюclang 3.5 а такжеgcc 5.

Ответы на вопрос(3)

Ваш ответ на вопрос