我正在考虑官方规范中的一个例子:
class A * A;
我读过这一行引入了两个名称:class A
,只能通过elaborated-specifier-type和指向A的指针访问。这行是否完全等同于以下两行?< / p>
class A;
A * A;
这条线只是语法糖,实际上我们有两行,如上所述?或者编译器如何解析class A * A;
?
答案 0 :(得分:9)
是的,内联声明只是语法糖。您可以在同一行上正确声明该名称和。
答案 1 :(得分:8)
我正在寻找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
中的标识符是“derived-declarator-type-listD
”,然后是T
标识符的类型是“derived-declarator-type-list cv-qualifier-seq指向class-specifier
的指针。”
现在class
里面包含class A * A
个关键字。因此* A
是有效的语法结构,其中{{1}}是声明者。