C++语法制作:类头

Joã*_*nso 1 c++ language-lawyer c++17

下面你会在[class]/1中找到语法生成类头的定义:

class-head:
  class-key attribute-specifier-seq opt class-head-name class-virt-specifier opt base-clause opt
  class-key attribute-specifier-seq opt base-clause opt

在段落的末尾,您将找到以下内容:

类符,其类头省略了类头名 定义了一个无名类.[注意:一个未命名的类因此不能是 最终的. - 尾注]

从上面开始,我收集了一个命名类的语法,即一个带有类头名,由上面的第一个定义给出,而一个未命名的类的语法由第二个定义给出.

一个简单的问题:不可能用第一个替换上面的两个定义,只需用class-head-name opt替换class-head-name就可以了?

或者更清楚.以下是不可能为class-head替换上面的定义?

class-head:
  class-key attribute-specifier-seq opt class-head-name opt class-virt-specifier opt base-clause opt

Nic*_*las 5

不,如果你这样做,那就会有歧义.class final可能意味着一个名为class的命名类final或一个final用作虚拟说明符的未命名类.

由于语法的定义方式,class final 总是指一个名为的类final.语法是明确的.括号内的符号不是规范性文本; 它只是解释了两个定义的原因.

现在,您可以通过添加另一个术语定义语法以实现相同效果的不同方式:

类头:

  class-key attribute-specifier-seq opt class-head-name-stuff opt base-clause opt

类头名-的东西:

  class-head-name class-virt-specifier opt