繁体   English   中英

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

[英]`type *var = (int)0`, legal or not?

以下示例:

char *var = (int)0;

在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错误?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM