36

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

4

2 回答 2

34

因为std::array<T, N>是一个聚合,它可以被初始化为constexpr当且仅当底层类型T有一个constexpr构造函数(当与你提供的每个初始化器一起出现时)。

于 2013-01-10T22:21:20.333 回答
11

基于@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() 
{        
}

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

12.1 构造函数 [class.ctor]

6 一个默认且未定义为已删除的默认构造函数在它被强制(3.2)创建其类类型(1.8)的对象时或当它在第一次声明后显式默认时被隐式定义。隐式定义的默认构造函数执行类的一组初始化,这些初始化将由用户编写的该类的默认构造函数执行,没有 ctor-initializer (12.6.2) 和空的复合语句。如果该用户编写的默认构造函数格式不正确,则程序格式错误。如果用户编写的默认构造函数满足 constexpr 构造函数 (7.1.5) 的要求,则隐式定义的默认构造函数是 constexpr。

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

于 2013-01-10T21:43:23.563 回答