C ++语法制作:class-head

时间:2016-12-01 18:03:38

标签: 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   基子句<子>选择

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

  

class-specifier ,其 class-head 省略了 class-head-name   定义一个未命名的类。 [注意:一个未命名的类因此不能   的最终即可。 - 后注]

从上面我收集的是,一个命名类的语法,即一个带有 class-head-name 的类,由上面的第一个定义给出,而未命名的语法class由第二个定义给出。

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

或者更清楚。以下是 class-head 替换上面的定义吗?

类头:
   class-key attribute-specifier-seq opt class-head-name opt class-virt-specifier opt base -clause <子>选择

3 个答案:

答案 0 :(得分:5)

没有。如果你这样做,那就会有歧义。 class final可以表示名为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

答案 1 :(得分:0)

你无法做到

  

类头:
   class-key attribute-specifier-seq opt class-head-name opt class-virt-specifier opt base-clause 选择

,因为那样会让 class-head 成为

  

class-key class-virt-specifier

原件不允许

答案 2 :(得分:0)

不,因为这样就可以省略 class-head-name ,同时仍然指定 class-virt-specifier

class-virt-specifier 的语法是:

  

类的virt说明符
  最终

正如您所提到的,未命名的课程不能最终