Предположим, что есть объявление:
struct A { static int i; };
A a;
Как я знаю, строка ввода int decltype(a)::i = 0; не имеет строго описанного поведения.
Его можно проанализировать как int decltype(a)::i = 0;, где:
int - спецификатор decl и decltype(a)::i declarator.
Однако он может быть проанализирован как int decltype(a) ::i = 0;, где
int и decltype(a) анализируются как decl-specifer s, а ::i - это объявление (re) глобальной переменной i - компилятор должен дать сообщение об ошибке msg, которое выглядит как "decl-specifier-seq не должен содержать двух спецификаторов типа.
Я четко знаю, что первый способ анализа должен быть правильным, но я не могу найти никаких доказательств.
Во всяком случае, в int A::a = 0;, A обязательно анализируется как часть declarator, потому что A является именем типа и, как описано в стандартном
Если имя типа встречается при разборе описания-spec-seq, оно интерпретируется как часть описания-spec-seq тогда и только тогда, когда нет предыдущего спецификатора типа, отличного от cv-квалификатора в Децл-спецификатор-сл.
В constrant decltype(a) не является именем типа, это спецификатор типа.
Я не "ссорился в соломе", у меня есть этот вопрос, потому что я пишу свой синтаксический анализатор для С++.
Итак, интересно, должно ли быть описание:
Если при разборе описания-spec-seq встречается спецификатор типа, он интерпретируется как часть описания-spec-seq тогда и только тогда, когда нет предыдущего спецификатора типа чем cv-определитель в spec-spec-seq.