如果标准数组初始化太小,C ++会引发错误吗?

时间:2019-08-16 11:51:23

标签: c++ gcc stdarray

假设我有一个数组:

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

在这种情况下是否有可能引发错误或警告?在某些情况下,使此显式匹配可能会有用。

3 个答案:

答案 0 :(得分:10)

您可以使用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

答案 1 :(得分:8)

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

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};

答案 2 :(得分:5)

您可以使用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
}

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