C++ 具有空指针的奇怪行为

C++ 具有空指针的奇怪行为,c++,C++,如果我编译(使用VisualStudio2010),我偶然发现了以下问题 我本以为两者都会失败,因为它们都显式地强制转换为不具有指针类型的整数。有人能帮我理解发生了什么事吗 编辑:再次尝试使用g++并成功。不知道我第一次做错了什么。现在我只是还不明白为什么它首先会工作。通过将0的值赋给指针,您将其设置为null,因此它是nullptr。要使指针的值为0,请执行以下操作: double * dbl = new double{0}; 通过将0的值赋给指针,可以将其设置为null,因此它是nullp

如果我编译(使用VisualStudio2010),我偶然发现了以下问题


我本以为两者都会失败,因为它们都显式地强制转换为不具有指针类型的整数。有人能帮我理解发生了什么事吗


编辑:再次尝试使用g++并成功。不知道我第一次做错了什么。现在我只是还不明白为什么它首先会工作。

通过将
0
的值赋给指针,您将其设置为null,因此它是
nullptr
。要使指针的值为0,请执行以下操作:

double * dbl = new double{0};

通过将
0
的值赋给指针,可以将其设置为null,因此它是
nullptr
。要使指针的值为0,请执行以下操作:

double * dbl = new double{0};

<>你已经游走到C++(C)的一个较模糊的区域。引用自(C++14的最新免费草案):

4.10指针转换[conv.ptr]

1空指针常量是值为零的整数文本(2.13.2)或类型为
std::nullptr\t
的prvalue。 空指针常量可以转换为指针类型;结果是该类型的空指针值

我有点惊讶于
(int)0
被接受为“整数文字”-事实上,我认为这是编译器中的一个错误(但它在很大程度上是一个特例)

啊哈!我刚刚记得:C和C++的老版本没有说“整数文字”,他们说“整数常量表达式”。code>int(0)是一个整数常量表达式,因此在较旧的编译器上允许使用它


<>这意味着你的G+问题可以取决于你是否指定了C++ 14或一个早期版本。

你已经游走到C++(和C)的一个较模糊的区域。引用自(C++14的最新免费草案):

4.10指针转换[conv.ptr]

1空指针常量是值为零的整数文本(2.13.2)或类型为
std::nullptr\t
的prvalue。 空指针常量可以转换为指针类型;结果是该类型的空指针值

我有点惊讶于
(int)0
被接受为“整数文字”-事实上,我认为这是编译器中的一个错误(但它在很大程度上是一个特例)

啊哈!我刚刚记得:C和C++的老版本没有说“整数文字”,他们说“整数常量表达式”。code>int(0)是一个整数常量表达式,因此在较旧的编译器上允许使用它


这意味着您的g++问题可能取决于您指定的是C++14还是更早的版本。

请包含来自
g++
的错误消息好吗?NathanOliver clang说,“我本以为这两个都会失败。”为什么?请检查一下,你能把
g++
中的错误信息包括进来吗?使用g++.@NathanOliver clang说,“我本以为两者都会失败。”为什么?请检查一下,我相信强制执行
(int)0
失败可能会破坏与现有代码匹配的方式。@Slava:你这么认为?大多数人写
NULL
0
——而不是
(int)0
。该转换是毫无意义的,因为<代码> 0 < /Cord>已经是int型的。MartinBonner(int)0或其他在旧C++标准中合法的表达式。限制它可能会破坏工作代码。@DieterLücking:我认为不应该。对我来说,这看起来像一个虫子——但我很可能错了!我相信强制执行
(int)0
失败可能会破坏与现有代码匹配的方式。@Slava:你这么认为?大多数人写
NULL
0
——而不是
(int)0
。该转换是毫无意义的,因为<代码> 0 < /Cord>已经是int型的。MartinBonner(int)0或其他在旧C++标准中合法的表达式。限制它可能会破坏工作代码。@DieterLücking:我认为不应该。对我来说,这看起来像一个虫子——但我很可能错了!
double * dbl = new double{0};