假设我有一个数组:
std::array<int, 6> {4,3,2};
在这种情况下是否有可能引发错误或警告?在某些情况下,使此显式匹配可能会有用。
答案 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
}
但是每个人都可以通过构造函数直接初始化数组。因此,如果您不(自动)检查某些编码准则,则无法保证您的代码库。