我正在使用 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
。
std::array<size_t, N>
中的N
不能从参数中推断出来(至少在我的编译器中),从那里开始std::enable_if
也没有帮助。或者你的意思不同? - alfC