我正在使用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
and gcc 5
。