Ответ 1
std::initializer_list<int> il = rand() ? std::initializer_list<int>{1}
: std::initializer_list<int>{1,2,3};
std::array<int, il.size()> a;
Вот почему.
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