arrays - 有没有办法强制对std::array进行完全初始化

标签 arrays c++11 initialization stdarray

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

最佳答案

简单的答案:您不能。

当使用列表初始化std::array时,它正在执行aggregate initialization,并且当列表大小小于成员数时会解释here:

  • 如果初始化程序子句的数量少于成员的数量,或者初始化程序列表完全为空,则剩余的成员将通过其括号相等的初始化程序(如果在类定义中提供)进行初始化,否则(由于C++ 14 )按空列表执行值初始化。如果引用类型的成员是这些其余成员之一,则程序格式错误(无法对引用进行值初始化)

  • 提供少于大小的列表只是一种合法且可接受的行为,因此编译器不会提示。您的代码:
    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/

    相关文章:

    javascript - 从多个输入获取值,无需重写相同的代码

    反向插入的Java数据结构

    javascript - JavaScript 中的结构体数组

    c++ - 基于 vector 获取范围内的项目索引

    C++ unique_ptr 移动构造函数

    C# 程序卡住在整数列表上

    arrays - Swift 错误 - 无法将类型 'MKOverlay' 的值转换为预期的参数类型 '@noescape (MKOverlay) throws -> Bool' - 执行 indexOf 时

    c++ - 我应该使用 shared_ptr 还是 unique_ptr?

    c - valgrind : Conditional jump or move depends on uninitialised value using strlen() strncat()

    c - 函数静态变量的初始化