【发布时间】: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*规则会以某种方式咬你. -
但是当没有模板的时候,允许这样的语法是不好的。