Ответ 1
Правило для запрещения нестатических элементов приведено в пункте 7.1.6.4:
Автотип-спецификатор может также использоваться при объявлении переменной в условие оператора выбора (6.4) или оператора итерации (6.5), в типе-спецификаторе-seq в идентификаторе нового типа или типе-идентификатора new-expression (5.3.4), в декларации для диапазона и в объявлении статический член данных с помощью элемента привязки или равенства, который появляется в спецификации элемента определения класса (9.4.2).
Я нашел обоснование того, что это статический здесь, который отражает то, как Джеймс Макнеллис объясняет это в комментарии.
Один национальный орган не любит, если автопилот-спецификатор без статики. По электронной почте авторам:
template< class T > struct MyType : T { auto data = func(); static const size_t erm = sizeof(data); };
Чтобы определить макет X, теперь мы имеем двухфазное имя и ADL. Обратите внимание, что func может быть либо типом, либо функцией; он может быть найден в T, пространстве имен MyType, связанного пространства имен T при создании экземпляра, глобальное пространство имен, анонимное пространство имен или любые пространства имен, подлежащие использованию директивы use. С осторожностью мы могли бы бросить некоторый поиск concept_map для удачи. В зависимости от порядка включения заголовка я мог бы даже получить разные результаты для ADL и нарушить одно правило определения, которое не требуется диагностировать.
Из-за этого спора авторы больше не предлагают, чтобы авто допускается для нестатических элементов данных.
Итак, в основном в зависимости от порядка включения заголовка, тип data
может быть очень различным. Конечно, auto x = 5;
не нужно было бы зависеть от поиска по 2-фазному имени или ADL, однако я предполагаю, что они сделали это "одеяло", потому что в противном случае им пришлось бы составлять индивидуальные правила для каждого варианта использования что сделало бы вещи очень сложными.
В той же статье автор предлагает устранить это ограничение, однако, похоже, это предложение было отклонено, вероятно, из-за вышеупомянутого обоснования, а также для того, чтобы ожидаемое поведение могло быть таким же, независимо от того, что инициализатор.