Я рассматриваю пример из официальной спецификации:
class A * A;
Я читал, что эта строка вводит два имени: class A
к которому можно получить доступ только через тип описанного спецификатора и указатель на A. Является ли эта строка полностью эквивалентной двум следующим строкам?
class A;
A * A;
Является ли эта строка просто синтаксическим сахаром, и на самом деле у нас есть две строки, как я указал выше? Или как class A * A;
разбирается компилятором?
Да, встроенная декларация — это просто синтаксический сахар. Вы объявляете это имя вперёд а также используя его на одной линии.
Я ищу более подробный ответ в рабочем проекте N3797, и я нашел следующее:
§8.3.3:
Таким образом, объявление определенного идентификатора имеет вид
T D
гдеT
имеет формуattribute-specifier-seq_*opt* decl-specifier-seq
а такжеD
является декларатором.
§7.1:
decl-specifier:
storage-class-specifier
type-specifier
function-specifier
friend
typedef
constexpr
decl-specifier-seq:
decl-specifier attribute-specifier-seq_*opt*
decl-specifier decl-specifier-seq
§7.1.6:
type-specifier:
trailing-type-specifier
class-specifier
enum-specifier
§8.3.1:
В декларации
T D
гдеD
имеет форму
* attribute-specifier-seq_*opt* cv-qualifier-seq_*opt* D1
и тип
идентификатор в объявленииT D1
такое «производный-декларатор-тип-список»T
, То
тип идентификатораD
это «производный-декларатор-тип-список cv-qualifier-seq указатель наT
«.
Сейчас class-specifier
содержит class
Ключевое слово внутри. следовательно class A * A
действительна грамматическая конструкция, где * A
является декларатором.