我正在使用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
时,它正在执行aggregate initialization
,并且当列表大小小于成员数时会解释here:
提供少于大小的列表只是一种合法且可接受的行为,因此编译器不会提示。您的代码:
A<5> a;
a.function({{1,2,3}}));
等效于:
A<5> a;
a.function({{1,2,3,0,0}}));
编译器。最好的选择是运行时错误(可能不是您期望的那样)。
关于arrays - 有没有办法强制对std::array进行完全初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32999822/