在类声明中是否有便携式分号分号
答
从我阅读标准来看,这是不允许的。
如果你只看语法定义,它似乎允许它。相关部分为:
成员规范是{ ... }
之间出现的类声明。
成员规范是成员声明和访问说明符的序列。一种可能的形式为成员声明是:
属性SPECI网络ER-SEQ选择 DECL-SPECI网络ER-SEQ选择成员声明符列表选择;
由于分号之前一切都是可选的,它看起来像它允许有一个空 成员声明,只由一个分号。
然而,9.2/1表示:
用于声明朋友(11.3)或引入基类的一个成员的名称到一个派生类(7.3.3),成员 - 当除声明宣布类的成员,并且每个这样的成员声明应声明类别的至少一个成员名称。
由于空的成员声明没有声明至少一个类的成员,所以即使某些编译器接受它,它似乎也不符合标准。
一个杂散分号只是一个[空表达式](http://ideone.com/q0uDc“Empty expression example”)。所以它应该是合法和便携的,虽然我不推荐它。另见http://stackoverflow.com/questions/824512/why-are-empty-expressions-legal-in-c-c – Zeta 2012-03-20 15:18:30
@Zeta:确实。但是在上述情况下允许表达吗? – 2012-03-20 15:24:25
@Oli:我不这么认为。在类定义中只允许声明(和'static_assert'),而不是表达式。成员初始值设定项当然可以有表达式,但这不适用于此。另外,如果这被解析为一个声明,这是非法的,因为没有声明任何内容的声明是不合格的。 – Xeo 2012-03-20 15:36:57