`type*var =(int)0`,合法与否?

Sha*_*baz 4 c++ gcc clang visual-c++ language-lawyer

以下示例:

char *var = (int)0;
Run Code Online (Sandbox Code Playgroud)

在gcc和cl.exe上编译,但在clang中导致错误:

不能使用'int'类型的右值初始化'char*'类型的变量

谁在这里是对的?


对于它的价值,C++ 11说(强调我的)

4.10/1

空指针常量是整数类型的整数常量表达式(5.19)prvalue,其计算结果为零或类型为std :: nullptr_t的prvalue.空指针常量可以转换为指针类型; 结果是该类型的空指针值和...

5.19/3

整数常量表达式是整数或未整数枚举类型的文字常量表达式.[注意:这些表达式可以用作数组边界(8.3.4,5.3.4),作为位字段长度(9.6),作为枚举器初始化器,如果底层类型不固定(7.2),作为空指针常量(4.10) )和作为比对(7.6.2). - 结束说明]

据我所知,上述代码应该是非法的.cl.exe臭名昭着地违反了标准(所以我不相信它),但是gcc也接受上面的代码.标准的其他部分是否与我缺失相关或者是否完全是一个gcc错误?

Bar*_*rry 6

最初,在C++ 11中,这是合法的,因为措辞是:

空指针常量是整数类型的整数常量表达式(5.19)prvalue,其计算结果为零

但是,从CWG缺陷903开始,这是一个针对C++ 11的缺陷,它变得不合法:

空指针常量是一个整数文字(2.13.2 [lex.icon]),其值为零

(int)0是整数类型的整数常量表达式prvalue,其值为零,但它实际上并不是具有值的整数文字0.

由于这是针对C++ 11的缺陷,因此代码本身在C++ 11中应该是错误的.