使用空指针

时间:2016-09-08 15:47:16

标签: c++

如果我编译(使用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 ++再次尝试并且工作了。不知道我第一次做错了什么。现在我仍然感到困扰,为什么它首先起作用。

2 个答案:

答案 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};