Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ `类型*var=(int)0`,是否合法?_C++_Gcc_Visual C++_Clang_Language Lawyer - Fatal编程技术网

C++ `类型*var=(int)0`,是否合法?

C++ `类型*var=(int)0`,是否合法?,c++,gcc,visual-c++,clang,language-lawyer,C++,Gcc,Visual C++,Clang,Language Lawyer,下面是一个例子: 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 整型常量表达式是整型或非作用域枚举类

下面是一个例子:

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),其计算结果为零

但是,到年,这是C++11的一个缺陷,它变得不合法:

空指针常量是值为零的整数文本(2.13.2[lex.icon])

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


由于这是C++11的一个缺陷,因此C++11中的代码本身应该是格式错误的。

您是否正确使用了GCC?也就是说,您是否正在使用
-pedantic-Wall-std=c++14
?对于新手来说,GCC不是一个容易正确使用的编译器。
char*var=(int)0
char*var=0不同
char*var=nullptr
@KerrekSB,我用
-Wall-std=c++11-pedantic
运行它。(gcc 6.2.0)@πνταῥεῖ, 我说是吗?@πάνταῥεῖ 因此,问题是这是否仍然是合法的,还是它是一个gcc错误。g++with
-std=c++14
仍然接受这一观点,但问题的“状态”似乎相当清楚地表明,这已被接受为DR,不是吗?因此,它现在一直是C++11及更高版本的一部分:-)@KerrekSB什么是“此问题已返回到“审阅”状态,以允许讨论是否容纳此类代码。”是什么意思?你怎么知道这是针对C++11的灾难恢复,还是仅仅针对C++14的修复?我不知道这句话是什么意思,但它的状态一直是“CD3”,并且将继续是“CD3”,因此它适用于自C++11以来的一切。就我所知,无论评论所指的是什么,似乎都没有影响决议。(如果需要,细节当然可以挖出来。)@KerrekSB,Barry,那么这里的最终裁决是什么,在C++11中是否合法?