Ответ 1
Вы выполняете преобразование l-t-r на i
, но для [expr.const]/(2.7) здесь не должно быть нарушено (2.7.3):
(2.7.1) касается полных объектов, (2.7.2) говорит о строковых литералах и (2.7.4) относится к объектам, чье жизненное время начиналось с оценки выражения - неприменимо, поскольку объявление a
предшествует b
's.
Определите a
как constexpr
, и код совместим.
Небольшое добавление, чтобы уточнить, что говорит стандарт: выражение внутри скобок должно быть преобразованным константным выражением типа std::size_t
([dcl.array ]/1), который определен в [expr.const]/4 как
Преобразованное константное выражение типа
T
является выражением, неявно преобразованным в типT
, где преобразованный выражение - это постоянное выражение и [... требования, которые удовлетворяются...]
Таким образом, действительно, стандарт интересует, есть ли или нет
constexpr std::size_t s = a;
будет действительным. Что это не так по указанным выше причинам - попытка использовать подобъект ранее определенного объекта не constexpr
.