5

以下代码可以用clang很好地编译。我想知道 C++ 标准是否可以接受。

class A {
  static void x; // #1
  static const void x; // #2
  static volatile void x; // #3
};

在我看来,没有任何声明是有效的。perenial C++ 标准验证套件 有这样一个测试(#1),而 clang(v3.4)在这方面失败了。

虽然,如果我从 #1 中删除静态,那么 clang 会按预期报告错误。

我查看了标准,发现有一段关于静态数据成员(9.4.2-2)的内容是:

2 静态数据成员在其类定义中的声明不是定义,并且可能是除 cv 限定的 void 之外的不完整类型。...

据我了解,这条线将 #2 和 #3 视为无效但不确定 #1。是否有更多与静态存储类声明相关的细节应该排除#1?

谢谢,

4

1 回答 1

5

不,这是不允许的,正是因为您引用的段落。请注意,您引用的段落中的“简历合格”一词包括不合格。根据 C++11 标准的第 3.9.3/10 段:

在本国际标准中,用于描述类型的符号cv(或cv1cv2等)表示任意一组 cv 限定符,即 { const}、{ volatile}、{ constvolatile}或空集之一。

于 2013-07-02T18:21:52.120 回答