除非我在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;
答案 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
的原因。