我目前正在创建一个带有constexpr
构造函数的类,我想知道是否可以使用std::array
来存储此类的数据。标准是否明确指定std::array
具有constexpr
构造函数,并且可以在编译时访问其内容?
答案 0 :(得分:25)
由于std::array<T, N>
是一个聚合,因此当且仅当基础类型constexpr
具有T
构造函数时(当与每个初始化程序一起显示时),它才能初始化为constexpr
你提供)。
答案 1 :(得分:9)
根据@MarkGlisse的评论:compiles
#include <array>
#include <iostream>
template<typename T, std::size_t N>
struct X
{
constexpr X(const std::array<T,N>& a):arr(a){}
private:
std::array<T,N> arr;
};
constexpr std::array<int,2> a {{ 13, 18 }};
constexpr X<int,2> x = a;
int main()
{
}
我相信我在这里找到了标准的相关引用:
12.1构造函数[class.ctor]
6默认构造函数,默认为未删除的默认构造函数 隐含地定义了在产生其对象的情况下(3.2) 类类型(1.8)或它在第一次之后显式默认 宣言。隐式定义的默认构造函数执行 由a执行的类的初始化集 用户编写的默认构造函数,该类没有 ctor-initializer(12.6.2)和一个空的复合语句。如果说 用户编写的默认构造函数将是格式错误的,程序是 病态的。如果用户编写的默认构造函数满足 constexpr构造函数(7.1.5)的要求,隐式定义 默认构造函数是constexpr。
这看起来基本上就像@ BenVoigt的回答。