如何使用constexpr char[]通过初始化列表初始化结构体中的char数组?
如何用constexpr字符数组初始化结构体中的char数组成员?
问题描述
现有以下代码:
constexpr char defaultName[6] = "Hello"; struct MyStruct{ char name[6]; int val; };
尝试用初始化列表MyStruct structObj{defaultName, 0};初始化结构体失败,希望使用defaultName这个constexpr变量通过初始化列表完成初始化,且无法修改结构体定义(结构体来自供C++调用的通用C库头文件)。已知直接用字符串字面量{"Hello", 0}或运行时strcpy可以实现,但想找初始化列表的解决方案。
解决方案
方法1:C++17及以上版本(推荐)
利用std::array的隐式转换特性,将constexpr字符数组转为std::array后直接用于初始化:
#include <array> constexpr char defaultName[6] = "Hello"; // 将原生数组转为std::array constexpr auto defaultNameArr = std::to_array<6>(defaultName); // 直接用std::array初始化结构体的char数组成员 MyStruct structObj{defaultNameArr, 0};
std::to_array会在编译期完成转换,完全符合constexpr的要求,且代码简洁。
方法2:兼容C11/C14版本
借助模板和编译期索引序列,将原生数组的元素展开为初始化列表:
#include <utility> template <size_t N, size_t... I> constexpr auto array_to_init_list(const char (&arr)[N], std::index_sequence<I...>) { return std::initializer_list<char>{arr[I]...}; } template <size_t N> constexpr auto array_to_init_list(const char (&arr)[N]) { return array_to_init_list(arr, std::make_index_sequence<N>()); } // 使用方式 constexpr char defaultName[6] = "Hello"; MyStruct structObj{array_to_init_list(defaultName), 0};
这套模板会在编译期生成对应长度的字符初始化列表,直接匹配结构体中char数组的初始化需求。
为什么原方法失效?
C++中,数组名在初始化列表中会被隐式转换为指针,而结构体的name成员是char[6]类型,无法用指针直接初始化——只有字符串字面量(如"Hello")是语言特殊允许直接用于数组初始化的情况,其他数组变量不行。
内容的提问来源于stack exchange,提问作者Dev G
相关产品推荐
相关产品推荐

