C++ 使用隐含长度初始化std::数组

C++ 使用隐含长度初始化std::数组,c++,arrays,c++11,stdarray,C++,Arrays,C++11,Stdarray,在C中,您可以执行inta[]={1,2,3,4,5},但是C++11std::array a={1,2,3,4,5}将给出一个“模板参数太少”的编译错误。有没有办法解决这个问题?std::array的实现: template<typename T, std::size_t N> struct array { T array_impl[N]; }; 模板 结构数组{ T数组_impl[N]; }; 因此,这应该是可行的: std::array<std::int, 5

在C中,您可以执行
inta[]={1,2,3,4,5}
,但是C++11
std::array a={1,2,3,4,5}
将给出一个“模板参数太少”的编译错误。有没有办法解决这个问题?

std::array的实现:

template<typename T, std::size_t N>
struct array {
    T array_impl[N];
};
模板
结构数组{
T数组_impl[N];
};
因此,这应该是可行的:

std::array<std::int, 5> a = {{ 1, 2, 3, 4, 5 }};
std::数组a={{{1,2,3,4,5};
这基本上就像编译器同意去掉内部的花括号一样

std::array<std::int, 5> a = { 1, 2, 3, 4, 5 };
std::数组a={1,2,3,4,5};

请参见

您所能拥有的最好的是
制作数组
,类似于:

template<typename T, typename...Ts>
constexpr std::array<T, 1 + sizeof...(Ts)> make_array(T&& head, Ts&&...tail)
{
     return {{ std::forward<T>(head), std::forward<Ts>(tail)... }};
}
模板
constexpr std::数组生成数组(T&&head,Ts&&tail)
{
返回{{std::forward(head),std::forward(tail)…};
}

那么,如果不说数组的长度是5,你怎么能做到这一点呢?你可以指定数组Rikayan,看看传递给模板的第二个模板参数。@DoryZidon这并没有回答他提出的问题。为什么
1+sizeof…(Ts)
?额外的空间是什么?@0x499602D2:
1
用于第一个参数
T head
(我们从
head
推断类型)。