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

Why is constexpr required even though member function is constexpr?

本文关键字:constexpr 成员 函数 为什么      更新时间:2023-10-16

除非我将constexpr放在initializer_list之前,否则以下内容不会编译:

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

但initializer_list大小为constexpr:

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;

这就是为什么。

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

通过编写std::array<int, il.size()> a;,您声称il.size()可以在编译时使用常量结果进行评估,从而允许模板实例化。

这就是为什么initializer_list::size()方法和il变量都需要声明为constexpr