以下示例:
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错误?
答案 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中应该是错误的。