当 std 数组初始化太小时,C++ 会引发错误吗?

Can C++ raise an error when std array initialization is too small?

假设我有一个数组:

std::array<int, 6> {4,3,2};

在这种情况下是否可以引发错误或警告?在某些情况下,明确匹配可能会有用。

您可以创建自己的抽象层,当您没有为初始化传递完全相同数量的参数时,它会发出抱怨。

template <std::size_t N, class ...Args>
auto createArray(Args&&... values)
{
   static_assert(sizeof...(values) == N);

   using First = std::tuple_element_t<0, std::tuple<Args...>>;

   return std::array<First, N>{values...};
}

被调用为

auto ok = createArray<6>(4, 3, 2, 1, 0, -1);

auto notOk = createArray<6>(4, 3, 2};

您可以使用 std::make_array 或类似的东西来使类型不同

std::array<int, 6> = std::make_array(4,3,2);

在 gcc 中出现此错误:

<source>:30:53: error: conversion from 'array<[...],3>' to non-scalar type 'array<[...],6>' requested

您可以使用 https://en.cppreference.com/w/cpp/experimental/make_array

而不是编写自己的 createArray 方法

如果你的编译器支持的话。

#include <experimental/array>
int main()
{
    std::array<int,5> arr1= std::experimental::make_array(1, 2, 3, 4, 5); // ok
    std::array<int,3> arr2= std::experimental::make_array(1, 2, 3, 4, 5); // fails
    std::array<int,6> arr3= std::experimental::make_array(1, 2, 3, 4, 5); // fails
}

但是大家可以直接通过构造函数初始化数组。因此,如果您不(自动)检查某些编码准则,则无法保证您的代码库。