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

Vin*_*ent 30 c++ arrays constexpr c++11

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

Ben*_*igt 28

因为它std::array<T, N>是一个聚合,所以constexpr只有当底层类型T有一个constexpr构造函数时(当你提供的每个初始化程序都显示时),它可以初始化为if .


Tem*_*Rex 9

基于@MarkGlisse的评论:这个编译

#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() 
{        
}
Run Code Online (Sandbox Code Playgroud)

我相信我在这里找到了标准的相关引用:

12.1构造函数[class.ctor]

6默认构造函数是默认的,未定义为已删除的默认构造函数是在产生其类类型(1.8)的对象(或者在第一次声明后明确默认)的情况下(3.2)进行隐式定义的.隐式定义的默认构造函数执行类的初始化集合,该初始化集合将由用户编写的该类的默认构造函数执行,没有ctor-initializer(12.6.2)和空的复合语句.如果该用户编写的默认构造函数不正确,则程序格式错误.如果该用户编写的默认构造函数满足constexpr构造函数(7.1.5)的要求,则隐式定义的默认构造函数为constexpr.

这看起来基本上像@ BenVoigt的答案.

  • 克里斯说,std :: array是一个聚合.什么部分让你感到困惑? (2认同)