C++ 为什么即使成员函数是constexpr,也需要constexpr?

C++ 为什么即使成员函数是constexpr,也需要constexpr?,c++,c++11,initializer-list,constexpr,C++,C++11,Initializer List,Constexpr,除非我将constexpr置于初始值设定项\u列表之前,否则不会编译以下内容: constexpr std::initializer_list<int> il = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; std::array<int, il.size()> a; 通过写入std::数组a您声称il.size()可以在编译时以恒定的结果进行计算,从而允许模板实例化 这就是为什么初始值设定项\u list::size()方法和il变量都

除非我将constexpr置于初始值设定项\u列表之前,否则不会编译以下内容:

constexpr std::initializer_list<int> il = {
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
std::array<int, il.size()> a;

通过写入
std::数组a
您声称
il.size()
可以在编译时以恒定的结果进行计算,从而允许模板实例化


这就是为什么
初始值设定项\u list::size()
方法和
il
变量都需要声明为
constexpr
的原因

甚至不清楚
constexpr std::initializer\u list li={..}在C++11中有效;它将用C++1y编写。
constexpr size_type size() const;
std::initializer_list<int> il = rand() ? std::initializer_list<int>{1}
                                       : std::initializer_list<int>{1,2,3};

std::array<int, il.size()> a;
struct S
{
    int m;
    constexpr int foo() const { return m; }
};

S s{rand()};
int j = s.foo();     // only known at run-time

constexpr S cs{42};
int arr[cs.foo()];   // compile-time constant