gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:04:29 25 4
gpt4 key购买 nike

我正在使用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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com