当 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
}
但是大家可以直接通过构造函数初始化数组。因此,如果您不(自动)检查某些编码准则,则无法保证您的代码库。
假设我有一个数组:
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
}
但是大家可以直接通过构造函数初始化数组。因此,如果您不(自动)检查某些编码准则,则无法保证您的代码库。