即使成员函数是constexpr,为什么还需要constexpr?

use*_*565 14 c++ initializer-list constexpr c++11

除非我在initializer_list之前放置constexpr,否则以下内容无法编译:

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

但是initializer_list的大小是constexpr:

constexpr size_type size() const;
Run Code Online (Sandbox Code Playgroud)

dyp*_*dyp 32

std::initializer_list<int> il = rand() ? std::initializer_list<int>{1}
                                       : std::initializer_list<int>{1,2,3};

std::array<int, il.size()> a;
Run Code Online (Sandbox Code Playgroud)

这就是为什么.

constexpr成员函数是一个函数可以常量表达式内执行,它并不一定产生结果是一个编译时间常数.例如:

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
Run Code Online (Sandbox Code Playgroud)