【问题标题】:'static void' as decl-specifier'static void' 作为 decl 说明符
【发布时间】:2013-07-02 18:15:51
【问题描述】:

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

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

在我看来,没有任何声明是有效的。 perenial C++ standard validation suite 有这样一个测试 (#1) 并且 clang (v3.4) 失败了。

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

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

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

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

谢谢,

【问题讨论】:

  • 这是一个 clang 扩展。我很确定我过去读过关于它的提交。
  • 有可能。不过,在什么情况下这个扩展可能有用?
  • 我猜如果您使用成员变量 T x 实例化 template<class T> class,那么如果 T = void 立即不中断可能会很有用。
  • 实际上我什至不确定允许void 成为一个完整的(单例)类型会是一个问题,也许sizeof(void)new void 或各种void* 规则会以某种方式咬你.
  • 但是当没有模板的时候,允许这样的语法是不好的。

标签: c++ c++11 clang clang++


【解决方案1】:

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

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

【讨论】:

  • 感谢您的快速回复。现在我想知道在clang中解决这个问题有多困难。或者我应该等待它被修复。
  • @AdityaKumar:不幸的是我不知道——我从未尝试过深入研究 Clang 的源代码 :(
  • 好的,非常感谢您的回答。
  • @AdityaKumar:没问题,很高兴它有帮助:)
猜你喜欢
  • 1970-01-01
  • 2012-01-21
  • 2012-09-19
  • 2018-05-12
  • 2015-01-16
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多