【问题标题】:How is class A * A; declaration parsed by C++?A类*A怎么样;由 C++ 解析的声明?
【发布时间】:2014-06-21 12:04:29
【问题描述】:

我正在考虑官方规范中的一个示例:

class A * A;

我读到这一行引入了两个名称:class A,只能通过详细说明符类型和指向 A 的指针访问。这一行是否完全等同于以下两行?

class A;
A * A;

那行只是语法糖,实际上我们有两行,正如我上面指定的那样?或者class A * A;是如何被编译器解析的?

【问题讨论】:

  • A*A 行是做什么的,没有意义
  • @TejasPatel 它声明了一个变量A,类型为A*
  • @LuchianGrigore 在第二个例子中,如果存在,它不会调用运算符 * 吗?
  • @AdriC.S.不,这是一个声明。

标签: c++ class types specifications


【解决方案1】:

是的,内联声明只是语法糖。您正在向前声明该名称在同一行使用它。

【讨论】:

  • 感谢您的回答。但我试图在规范中找到一些关于它的信息。能给我参考一下吗?
  • 另外,您可以声明一个与类同名(大小写和全部)的变量这一事实并不意味着您应该这样做它。 :D
  • 我不明白为什么这一行在 c++ 中有效。能给个参考吗?
  • @DmitryFucintv 对不起,不——如果你真的想的话,可以通过标准和罚款。
  • 再次感谢您的帮助。我听从了您的建议,并在规范中找到了这一点。我决定发布其他答案。
【解决方案2】:

我正在 N3797 工作草案中寻找更详细的答案,我发现了以下内容:

§8.3.3

因此,特定标识符的声明具有T D 的形式 其中Tattribute-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 中的标识符是“derived-declarator-type-list T”,那么 D 的标识符类型是“derived-declarator-type-list cv-qualifier-seq pointer to T”。

现在 class-specifier 内部包含 class 关键字。因此class A * A 是有效的语法构造,其中* A 是声明符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多