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

时间:2013-11-27 11:40:25

标签: c++ c++11 initializer-list constexpr

除非我在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;

但是initializer_list的大小是constexpr:

constexpr size_type size() const;

2 个答案:

答案 0 :(得分: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;

这就是原因。

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

答案 1 :(得分:2)

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

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