C++ 如何初始化std::array<;char,N>;字符串文字省略尾随的'\0';

C++ 如何初始化std::array<;char,N>;字符串文字省略尾随的'\0';,c++,arrays,c++11,C++,Arrays,C++11,我有一个文件结构,其中固定长度的字符串没有尾随零。 如何将字段初始化为std::array而不尾随零: #pragma pack(push, 1) struct Data { // Compiles, but it has an undesired '\0': std::array<char, 6> undesired_number{"12345"}; // Does not compile: std::array<char, 5> num

我有一个文件结构,其中固定长度的字符串没有尾随零。 如何将字段初始化为std::array而不尾随零:

#pragma pack(push, 1)
struct Data {
    // Compiles, but it has an undesired '\0':
    std::array<char, 6> undesired_number{"12345"};
    // Does not compile:
    std::array<char, 5> number{"12345"}; // stripping '\0'
};
#pragma pack(pop)
#pragma包(推送,1)
结构数据{
//编译,但它有一个不需要的“\0”:
std::数组不需要的_数{“12345”};
//不编译:
std::数组号{“12345”};//正在剥离“\0”
};
#布拉格语包(流行语)

字符串文字<强> NUL终止,在C++中(与C不同),不能通过提供<代码>长度-1 < /代码>大小来关闭它;因此,它不能直接完成,同时考虑到

数组
内部是一个
T[N]

的辅助函数

template <std::size_t N, std::size_t ... Is>
constexpr std::array<char, N - 1>
to_array(const char (&a)[N], std::index_sequence<Is...>)
{
    return {{a[Is]...}};
}

template <std::size_t N>
constexpr std::array<char, N - 1> to_array(const char (&a)[N])
{
    return to_array(a, std::make_index_sequence<N - 1>());
}
模板
constexpr std::数组
to_数组(常量字符(&a)[N],std::索引_序列)
{
返回{a[Is]…};
}
模板
constexpr std::数组到_数组(const char(&a)[N])
{
返回到_数组(a,std::make_index_sequence());
}
然后

struct Data {
    std::array<char, 5> number{to_array("12345")}; // stripping '\0'
};
struct数据{
std::数组编号{to_数组(“12345”)};//剥离'\0'
};

什么是编译器错误?不兼容的类型?恐怕基于字符串文字是不可能的。为什么必须使用字符串文字来初始化它呢?@Barmar只是为了方便起见,字符串文字总是附加有
'\0'
或等价物。我赌的是一些中间
constexpr
/template魔术,它会将文字去掉返回0并返回一个截断的值。但是,这可能会有问题,因为您无法修改字符串文本。可能常量表达式的例外情况允许这样做。您可以创建一个用户定义的文本。我想知道这是否会编译成一个文本副本,或者两个,一个带终止符,一个不带终止符。@luk32,取决于编译器和优化设置。例如,带有O3的g++根本没有文字。在获得
make_index_sequence
并更改为
std::array number=to_array(“12345”)后,它与C++11配合得很好
您可以在返回类型之前添加
constepr
,以启用
std::array
的编译初始化。我检查了g++的程序集输出,并添加了允许作为可执行映像的一部分初始化的
static const
变量。没有
constexpr
它就进行了运行时初始化。@VioletGiraffe:
std::array
主要是
struct{T data[N];},因此对于聚合初始化,第一个括号用于类
数组
,第二个括号用于其
数据
成员。(一对可以省略,但编译器可能会警告“缺少”大括号)。该标准不要求
数组内部为
t[N]
。有些人认为,无论如何,对于
N>0的情况,应该这样做