Ответ 1
Как говорит Yola ответ, создается временный массив, а выражение elem > 0
пытается применить преобразование lvalue-to-rval в elem
. Теперь мы ссылаемся на стандартный [expr.const]/2:
Выражение e является выражением основной константы, если оценка e, следуя правилам абстрактной машины, не будет оценивать одно из следующих выражений:
...
преобразование lvalue-rvalue, если оно не применяется к
нестабильный glvalue интегрального или перечисляемого типа, который ссылается на полный энергонезависимый объект const с предшествующей инициализацией, инициализированный константным выражением, или
нестабильное значение glvalue, которое ссылается на подобъект строкового литерала или
нестабильное значение glvalue, которое относится к энергонезависимому объекту, определенному с помощью
constexpr
, или относится к не изменяемому подобъекту такого объекта, илинестабильный glvalue типа literal, который относится к энергонезависимому объекту, чье время жизни начиналось с оценки e;
...
Обратите внимание, что первая пуля здесь не применяется, потому что elem
не относится к объекту complete (это подобъект массива). Третья пуля тоже не применяется, поскольку временный массив не определен с помощью constexpr
, хотя это объект const. В результате all_positive(num_list)
не может стать постоянным выражением.
Ключ заключается в том, что доступ к элементу массива const, но не constexpr
не допускается в константном выражении, хотя значения этих элементов могут быть определены при компиляции время. Следующий фрагмент кода показывает эту проблему:
const int ci[1] = {0};
const int &ri = ci[0];
constexpr int i = ri; // error