С [expr.const] / 4 :
Выражение e
является выражением основной константы , если только оценка e
, следуя правилам абстрактной машины, оценил бы одно из следующих выражений:
- [...]
- id-выражение , которое относится кпеременная или член данных ссылочного типа, если только ссылка не имеет предшествующей инициализации и либо
- ее можно использовать в константных выражениях, либо
- ее время жизни началось в пределах оценки
e
;
- [...]
In:
static_assert(size(arg) > 0);
У нас есть id-выражение , котороессылается на переменную ссылочного типа, и ссылка не имеет предшествующей инициализации, поэтому у нас нет константного выражения.
Я думаю, что это так:
static_assert(size(a) > 0);
работает из-за "предшествующей"«инициализация» - мы вводим постоянную оценку, напрямую связывая ссылку arg
с переменной a
, wздесь, в другом случае, мы привязываем ссылку к другой ссылке.
Оба должны работать, если вы берете значение.