Как класс A * A; объявление разбирается на C ++?

Я рассматриваю пример из официальной спецификации:

class A * A;

Я читал, что эта строка вводит два имени: class A к которому можно получить доступ только через тип описанного спецификатора и указатель на A. Является ли эта строка полностью эквивалентной двум следующим строкам?

class A;
A * A;

Является ли эта строка просто синтаксическим сахаром, и на самом деле у нас есть две строки, как я указал выше? Или как class A * A; разбирается компилятором?

10

Решение

Да, встроенная декларация — это просто синтаксический сахар. Вы объявляете это имя вперёд а также используя его на одной линии.

9

Другие решения

Я ищу более подробный ответ в рабочем проекте 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 является декларатором.

8

По вопросам рекламы [email protected]