Ответ 1
Он не разрешен языком:
[C++11: 7.1.6.4]:
1 Спецификатор типа
auto
означает, что тип объявляемой переменной должен быть выведен из его инициализатора или что декларатор функции должен включать тип возвращаемого возвращаемого значения.2 Спецификатор типа
auto
может появляться с помощью декларатора функции с возвращаемым типом возвращаемого типа (8.3.5) в любом контексте, в котором такой декларатор действителен.3 В противном случае тип переменной выводится из ее инициализатора. Имя объявляемой переменной не должно появляться в выражении инициализатора. Это использование
auto
допускается при объявлении переменных в блоке (6.3), в области пространства имен (3.3.6) и в for-init-statement (6.5.3).auto
должен отображаться как один из спецификаторов decl в спецификаторе-seq, а в указателе-спецификаторе-seq должен следовать один или несколько init-declarators, каждый из которых должен иметь непустой инициализатор.4 Спецификатор типа
auto
также может использоваться при объявлении переменной в условии оператора выбора (6.4) или оператора итерации (6.5), в типе-спецификаторе-seq в идентификаторе нового типа или в типе-идентификаторе нового выражения (5.3.4), в объявлении для диапазона и при объявлении статического элемента данных с, который появляется в спецификации элемента определения класса (9.4.2).5 Программа, которая использует
auto
в контексте, явно не разрешенном в этом разделе, плохо сформирована.
Трудно доказать отрицательный результат, но в стандарте нет явного правила, позволяющего auto
в вашем случае.
Однако те же правила означают, что справедливо следующее:
struct Foo {
static constexpr auto constant_string = "foo";
};
int main() {}
(Обратите внимание, что тип Foo::constant_string
равен char const* const
, а не, скажем, char const[3]
; это эффект использования auto
.)