可以在constexpr类中使用std :: array吗?

时间:2013-01-10 21:16:25

标签: c++ arrays c++11 constexpr

我目前正在创建一个带有constexpr构造函数的类,我想知道是否可以使用std::array来存储此类的数据。标准是否明确指定std::array具有constexpr构造函数,并且可以在编译时访问其内容?

2 个答案:

答案 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的回答。