Объявления Typedef могут, в то время как объявления псевдонимов, использоваться в качестве операторов инициализации?
грамматика для инструкции инициализации для C ++ 17 выглядит следующим образом:
init-заявление:
выражение-заявление:
- expression_opt;
простое объявление:
- объявление-спецификатор-последовательность инициализации-декларатора-списка_опт;
- атрибут-спецификатор-последовательность-декларант-спецификатор-последовательность-инициализации-декларатора-список;
- атрибут-спецификатор-seq_opt декларация-спецификатор-последовательность ref-qualifier_opt [список-идентификаторов] инициализатор;
[...]
Может быть объявление typedef используется как init-statement, и, например, следующий допустимый код (C ++ 17):
if (typedef int Foo; true) { (void)Foo{}; }
// ^^^^^^^^^^^^^^^ init-statement
switch(typedef int Foo; 0) { case 0: (void)Foo{}; }
// ^^^^^^^^^^^^^^^ init-statement
тогда как объявление-псевдонима нельзя использовать в качестве инструкции инициализации:
if (using Foo = int; true) { (void)Foo{}; }
// ^^^^^^^^^^^^^^^ error: expected expression
switch(using Foo = int; 0) { case 0: (void)Foo{}; }
// ^^^^^^^^^^^^^^^ error: expected expression
Afaics объявление typedef является допустимым простым-объявлением, поскольку typedef
является decl-спецификатор, который является частью decl-specified-seq, который, в свою очередь, сам по себе является действительным простая-декларация, тогда как < em> объявление-псевдонима - это совершенно другое объявление, а не простое-объявление.
Как и ответы в В чем разница между 'typedef 'и' using 'в C ++ 11?, у меня всегда было впечатление, что объявления псевдонимов имеют ту же семантику, что и объявления typedef, и никогда не отстают от них, но, как видно из приведенных выше примеров (начиная с C ++ 17?), В случаях использования, ограниченных простым-объявлением: s, особенно операторами инициализации C ++ 17 (init-statement: s).
Вопрос:
- Действительно ли объявление typedef является действительным init-statement / простым-объявлением, тогда как объявление псевдонима - нет? Является ли это намеренным «отклонением» от C ++ 17 w.r.t. предыдущая (почти -?) идентичная семантика этих двух типов объявлений?