C++ 如何使用C++;11 constexpr构造函数是否从指针完全初始化C样式数组?

C++ 如何使用C++;11 constexpr构造函数是否从指针完全初始化C样式数组?,c++,arrays,c++11,constexpr,C++,Arrays,C++11,Constexpr,在c++11中,我想要一个如下所示的结构: template<unsigned n> struct bytes_block { char data[n]; constexpr bytes_block(char const *s):data(....) {} }; 模板结构字节\u块{ 字符数据[n]; constexpr bytes_块(char const*s):数据(..){ }; 可以安全地假设构造函数参数“s”指向一个内存区域,在该区域中,可以从“s”开始

在c++11中,我想要一个如下所示的结构:

template<unsigned n> struct bytes_block {
    char data[n];
    constexpr bytes_block(char const *s):data(....) {}
};
模板结构字节\u块{
字符数据[n];
constexpr bytes_块(char const*s):数据(..){
};
可以安全地假设构造函数参数“s”指向一个内存区域,在该区域中,可以从“s”开始复制至少n个连续字符,而无需调用构造函数中的任何UB

我不知道如何填写。。。然而,在上面


字节块构造函数的constexpr实现是否符合C++11?可以创建任意数量的附加constexpr函数用作助手,当然,只要它们只包含一条返回语句。

您可以通过使用中的参数包编制索引来实现这一点。当然,这在C++11中并不存在,但很容易实现:

#包括
#包括
//如果可用,请使用'std::index_sequence',否则请实现它。
名称空间详细信息{
#如果uu cplusplus<201300L
模板
结构整数_序列{};
模板
使用索引\序列=整数\序列;
模板
结构索引\序列\八个\附加;
模板
结构索引\u序列\u八个\u附加{
使用type=index\u序列<
N.,(sizeof…(N)+N.,(2u*sizeof…(N)+N.,(3u*sizeof…(N)+N.)。。。,
(4u*sizeof…(N)+N).,(5u*sizeof…(N)+N).,(6u*sizeof…(N)+N)。。。,
(7u*sizeof…(N)+M)。。。
>;
};
模板
结构make\u index\u sequence\u helper{
使用type=typename索引\序列\八项\追加::type;
};
模板结构生成索引序列助手{using type=index\u sequence;};
模板结构生成索引序列助手{using type=index\u sequence;};
模板结构生成索引序列助手{using type=index\u sequence;};
模板结构生成索引序列助手{using type=index\u sequence;};
模板结构生成索引序列助手{using type=index\u sequence;};
模板结构生成索引序列助手{using type=index\u sequence;};
模板结构生成索引序列助手{using type=index\u sequence;};
模板结构生成索引序列助手{using type=index\u sequence;};
//模板实例化深度为'4+(log_2(N)/3)`
模板
使用make\u index\u sequence=typename make\u index\u sequence\u helper::type;
#否则
使用std::index_序列;
使用std::make_index_序列;
#恩迪夫
}
然后,构造函数变得非常简单,只需授权获取包并使用它编制索引:

模板结构字节\u块{
字符数据[n];
constexpr bytes_block(char const*s):bytes_block(detail::make_index_sequence{},s){
私人:
模板
constexpr bytes_块(detail::index_序列,char const*s):数据{s[I]…}{
};

你不能。在C++20中,std::char_traits::copy是
constepr
并允许您。您必须以不同的方式定义构造函数,例如const-ref数组-
const-char(&s)[n]
并滚动循环(即使实际上可能需要C++14)。它不是可变长度,因为它是一个常量模板参数。传入无法在编译时作为模板参数进行计算的表达式将是编译时错误。您是正确的。在我当前的思考过程中,我有一个错误的地方。这个答案在C++11中有一个错误,当使用一个关于当查看块大小为8时访问一个不完整的类型,特别是
无效使用不完整的类型'detail::make_index_sequence'{aka'struct detail::integer_sequence'}
。显然,您在编辑之前给出的答案没有该错误。