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

C++如何通过一行代码或构造函数初始化列表从另一数组初始化数组

C++ 数组成员初始化问题解决方案

1. 类内const数组成员初始化

const类型成员必须在构造函数初始化列表完成初始化,不能在构造函数体内赋值。原生数组不支持直接批量复制初始化,我们可以通过索引序列展开数组元素完成初始化:

#include <utility>
#include <cstddef>

template <int size>
struct StructWithArray
{
    // 内部构造函数:用索引序列展开逐个初始化数组元素
    template <std::size_t... I>
    constexpr StructWithArray(const char (&arrArg)[size], std::index_sequence<I...>) 
        : arr{arrArg[I]...} {}

    // 对外暴露的构造函数,自动生成索引序列
    constexpr StructWithArray(const char (&arrArg)[size]) 
        : StructWithArray(arrArg, std::make_index_sequence<size>{}) {}

    const char arr[size];
};

该方案兼容const和constexpr场景,C14及以上标准可直接使用,C11可自行实现简易版index_sequence适配。

2. 函数内static const数组初始化

针对无法直接赋值的static const数组,可以借助std::array包装类+立即调用lambda完成初始化,C++20环境下写法如下:

#include <cstring>
#include <array>

void afunc()
{
    char somearray[] = "Something from somewhere";
    // 立即调用lambda完成初始化,逻辑全部封装在lambda内部
    static const auto somearray2 = []{
        std::array<char, sizeof(somearray)> arr{};
        memcpy(arr.data(), somearray, sizeof(somearray));
        return arr;
    }();
    
    // 后续可以通过somearray2.data()获取原生数组指针使用
}

如果需要constexpr属性,只需要给lambda增加constexpr修饰即可,只要初始化逻辑符合常量表达式要求就能编译通过。

3. std::array的实现逻辑

  • std::array是标准库提供的固定大小数组包装类,本身属于聚合类型,内部仅封装了一个原生数组,没有自定义构造函数,支持和原生数组一样的聚合初始化语法。
  • 它的拷贝/移动构造都是编译器默认生成的,会自动逐元素复制内部的原生数组,因此可以像普通对象一样直接完成初始化赋值,不需要用户手动处理数组元素拷贝逻辑,天然解决了原生数组不能直接复制初始化的问题。
  • 它提供的data()、operator[]、迭代器等接口和原生数组使用习惯完全一致,没有额外性能开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:06:01