C++ 类内的静态constexpr初始化链

C++ 类内的静态constexpr初始化链,c++,static,initialization,constexpr,C++,Static,Initialization,Constexpr,我有一个常规类,我们称之为Handler,它执行一些在运行时按需调用的算法。 该算法读取一个数组(m_arr),其内容在编译时是已知的,因此我想利用constexpr对其进行初始化 我不想要一个聚合初始化器(它可能看起来很难看),我想使用一个初始化数组的函数。 为了美观和封装,我希望将它们保留为处理程序的静态成员。m_arr我想限定constexpr本身,因为我想用基于它的另一个函数初始化另一个数组(如果我首先成功使用这个函数) 目前我正与四个传播错误作斗争。 这是我试图实现的目标的草稿(带有错

我有一个常规类,我们称之为
Handler
,它执行一些在运行时按需调用的算法。 该算法读取一个数组(
m_arr
),其内容在编译时是已知的,因此我想利用
constexpr
对其进行初始化

我不想要一个聚合初始化器(它可能看起来很难看),我想使用一个初始化数组的函数。 为了美观和封装,我希望将它们保留为
处理程序的静态成员。
m_arr
我想限定
constexpr
本身,因为我想用基于它的另一个函数初始化另一个数组(如果我首先成功使用这个函数)

目前我正与四个传播错误作斗争。 这是我试图实现的目标的草稿(带有错误标记):

#包括
类处理程序
{       
静态常数int SIZE=20;
静态constexpr std::array initArr();
static constexpr std::array m_arr;//C2737“private:static std::array const Handler::m_arr':“constexpr”对象必须初始化
//这个类处理的许多其他非常量内容。。。
};
constexpr std::array Handler::m_arr=Handler::initArr()//C2131表达式的计算结果不是常数
constexpr std::数组处理程序::initArr()
{
std::array arr;//C3250“arr”:在“constexpr”函数体中不允许声明
arr[0]=int(2);//C3249“constexpr”函数的非法语句或子表达式
arr[1]=int(7);//C3249“constexpr”函数的非法语句或子表达式
arr[2]=int(4);/-|--
//...
返回arr;
}
显然,我在这里做错了什么——或者——我期望从语言中得到它无法提供的东西(编译器-MSVC 2015/14.0)


非常感谢对错误原因的解释(以及最接近的工作选项)…

一般来说,类中的静态函数不能用于初始化
constepr
静态数据成员,因为在初始化时不考虑函数定义。您需要将其设置为自由函数并初始化类主体中的数据成员:

constexpr std::array<int, SIZE> init()
{
    // ...
}

struct C {
    static constexpr std::array<int, SIZE> arr = init();
};
constepr std::array init()
{
// ...
}
结构C{
静态constepr std::array arr=init();
};

您是否包括?请提供一个。显示
LiteralType
@L.F的定义。在这里,我仔细检查了错误集是否相同。
=initArray()
不应该是初始声明的一部分吗?另外,为什么您认为
静态constexpr std::array m_arr{2,7,4}
很难看?所以非静态成员函数和全局函数可以用作constexpr初始化度量()但静态方法不行?我想知道…@静态成员函数直到类定义结束才被认为是定义的,但是
constexpr
静态数据成员的初始值设定项是在类中处理的。这就是为什么如果将
init
设置为静态函数,会出现“调用未定义函数”错误的原因。假设我们有一些基于循环的复杂初始化函数(无论如何都不能用聚合初始值设定项替换),这似乎是语言中的一个明显限制(愿意包含所属类中的所有相关内容)。这种情况可能很常见,我不是一个模型,但我自己做不同的运行时初始化(查找表等),否则可能会作为
constexpr
处理(为了美观起见,将其包含在一个类中)。你不同意吗?@该死的嗯。。。我明白你的意思。现在,只需将全局函数放在详细名称空间中:(
constexpr std::array<int, SIZE> init()
{
    // ...
}

struct C {
    static constexpr std::array<int, SIZE> arr = init();
};