Есть ли способ обеспечить полную инициализацию 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
.