constexpr数组成员是否编译时间常数?

o.s*_*son 18 c++ c++11

是代码片段

struct Parameters {
   static constexpr int n = 2;
   static constexpr double v[n] = {4.0, 5.0};
};
Run Code Online (Sandbox Code Playgroud)

合法的C++ 11?并且,如果是这样,是Parameters::v[0]Parameters::v[1]编译时间常量或只是指针Parameters::v本身a constexpr(无论在编译时意味着什么)?

正如您所看到的,我通常对constexpr数组及其在类/结构中的初始化感到困惑.请随时回答我的具体问题,并提及有关此主题的常见陷阱等.

Rei*_*ica 4

我认为结构没有问题。引用 C++11 [dcl.constexpr],:

\n\n
\n

\xc2\xa71constexpr说明符仅适用于变量的定义、函数或函数模板的声明或文字类型 (3.9) 的静态数据成员的声明。...

\n\n

\xc2\xa79constexpr对象声明中使用的说明符将对象声明为const。这样的对象应具有文字类型并应进行初始化。如果它是由构造函数调用初始化的,则该调用应为常量表达式 (5.19)。否则,或者如果在引用声明中使用 constexpr 说明符,则其初始值设定项中出现的每个完整表达式\n 应为常量表达式。用于转换初始化表达式的每个隐式转换和用于初始化的每个构造函数调用都应是常量表达式 (5.19) 中允许的那些转换之一。

\n
\n\n

double是文字类型,文字类型数组也是文字类型。这意味着您的代码中的v[0]v[1]确实是常量表达式。

\n