Как обычно для константных выражений, нам нужно просмотреть список в [expr.const] и посмотреть, не разрешено ли какое-либо написанное нами подвыражение. В этом случае уместным является следующий пункт:
2.11 id-выражение, которое ссылается на переменную или элемент данных ссылочного типа, если ссылка не имеет предшествующей инициализации и
- он инициализируется константным выражением или
- его время жизни началось в пределах оценки
e
;
Вот что стучит ref
из воды. Он не появился с оценкой count(ref)
, так как он объявлен заранее и не инициализируется с помощью константного выражения. Это может быть 7
, но фактический инициализатор является временным объектом, поскольку именно с этим связывается ссылка.
Что касается использования value
. Это потому, что нет пули, которая запрещает value
. И эталонный аргумент теперь имеет время жизни, начинающееся с оценки count(value)
, а не заранее. Так что это допустимая ссылка для создания в константном выражении, но ее просто нельзя использовать для чтения value
.