如果我编译(使用Visual Studio 2010)
,我偶然发现了以下问题int main()
{
double* d_ptr = int(0);
if(d_ptr == nullptr)
cout << "I am a nullptr" << endl;
return 0;
}
我得到的结果是“我是一个nullptr”
如果我将指针赋值替换为:
,这也有效double* ptr = (int) 0;
我希望两者都失败,因为它们都显式地转换为没有指针类型的整数。有人可以帮我理解发生了什么吗?
编辑:用g ++再次尝试并且工作了。不知道我第一次做错了什么。现在我仍然感到困扰,为什么它首先起作用。答案 0 :(得分:4)
你已经徘徊在C ++(和C)的一个较为模糊的领域。引自n4296(这是C ++ 14最新的免费草案):
4.10指针转换[conv.ptr]
1 空指针常量是一个整数文字(2.13.2),其值为零或prvalue类型为
std::nullptr_t
。 空指针常量可以转换为指针类型;结果是该类型的空指针值
我稍微感到惊讶,(int)0
被接受为&#34;整数字面&#34; - 事实上,我认为这是编译器中的一个错误(但它是一个极端情况)。
阿公顷!我刚才记得:C和C ++的旧版本并没有说&#34;整数字面&#34;,他们说&#34;整数常量表达&#34;。 int(0)
是一个整型常量表达式,因此在较旧的编译器中允许使用。
这意味着您使用g ++的问题可能取决于您是否指定了C ++ 14或更早版本。
答案 1 :(得分:0)
通过为指针指定0
的值,您将其设置为null,因此它是nullptr
。要使指针的值为0,请执行以下操作:
double * dbl = new double{0};