Предположим, что есть объявление:
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.