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