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

时间:2017-02-27 16:51:44

标签: c++ gcc visual-c++ clang language-lawyer

以下示例:

char *var = (int)0;

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

  

无法初始化类型' char *'使用' int'

类型的右值

谁在这里是对的?

对于它的价值,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错误?

1 个答案:

答案 0 :(得分:6)

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

  

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

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

  

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

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

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