You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需指定长度初始化C++ std::array:如何从初始化列表推导长度?

当然可以!用C++17的类模板参数推导就能解决这个问题

你吐槽的这个重复指定数组大小的问题确实很烦人,完全违反DRY原则——好在从C++17开始,标准库引入了类模板参数推导(CTAD,Class Template Argument Deduction),专门解决这类需要手动重复模板参数的场景,std::array也完美支持这个特性。

具体怎么写?

在C++17及以后的版本里,你有两种简洁的写法可选:

  1. 完全让编译器推导所有参数:
    // 编译器会自动推导元素类型为int,数组大小为3
    std::array my_array {1, 5, 3};
    
  2. 显式指定元素类型,让编译器推导大小:
    // 你指定元素类型为int,编译器自动算出初始化列表的长度是3
    std::array<int> my_array {1, 5, 3};
    

这两种写法都能达到你想要的效果:不用手动写数组长度,完全从初始化列表里自动推导,彻底避免重复。

注意事项

  • 如果初始化列表里的元素类型不一致,编译器会自动推导它们的共同类型。比如std::array my_array {1, 2.5, 3};会把元素类型推导为double。
  • 如果你需要强制元素为某个特定类型(比如避免隐式转换),显式指定第一个模板参数就好,比如std::array<float> my_array {1, 2, 3};,元素会被转换成float类型。

旧版本C++的变通方案

如果你还在使用C11或C14(没有CTAD支持),可以自己实现一个make_array模板函数来绕开这个问题:

template<typename T, typename... Args>
constexpr std::array<T, sizeof...(Args)> make_array(Args&&... args) {
    return {std::forward<Args>(args)...};
}

// 使用方式:指定元素类型,自动推导大小
auto my_array = make_array<int>(1, 5, 3);

这个函数会根据传入的参数数量自动计算数组大小,同样能避免手动重复写数字。不过当然,这不如C++17的原生CTAD简洁直观。

内容的提问来源于stack exchange,提问作者schorsch312

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:48:16