什么更好用于C ++ 11,零或NULL?

时间:2012-10-26 17:42:57

标签: c++ pointers c++11

如今,使用C ++ 11,Whats建议使用,Zero还是NULL?第二个if中的第一个?

int * p = getPointer();

if( 0 == p ){
    // something
}

if( NULL == p ){
    // something
}

更新:我忘记了新的

if( nullptr == p ){
    // something
}

更新2:示例是显示写入空指针的选项,我知道写if( !p )会更愉快。

4 个答案:

答案 0 :(得分:29)

两者都没有,nullptr

虽然,在你的情况下,我只是选择

if ( !p ){
   //something
}

2.14.7指针文字[lex.nullptr]

  

1指针文字是关键字nullptr。它是std::nullptr_t类型的prvalue。 [注意:std::nullptr_t   是一种不同的类型,既不是指针类型也不是指向成员类型的指针;相反,这种类型的prvalue是   空指针常量,可以转换为空指针值或空成员指针值。

答案 1 :(得分:27)

其他答案是正确的。但我想多说一点为什么 nullptr更好。

在C ++ 11中,“完美转发”非常重要。它随处可见。明显的地方是bindfunction。但它也被用于许多其他地方。但“完美转发”并不完美。它失败的地方之一是空指针常量。

template <class T>
void display(T)
{
    std::cout << type_name<T>() << '\n';
}

template <class T>
void
f(T&& t)
{
    display(std::forward<T>(t));  // "perfectly forward" T
}

int main()
{
    f(0);
    f(NULL);
    f(nullptr);
}

使用type_name<T>()的适当定义,在我的系统上打印出来:

int
long
std::nullptr_t

这很容易区分工作代码和错误。运气好的话,你的错误将在编译时出现(带有可怕的错误信息)。但在某些情况下,您可能还会遇到运行时错误。

积极禁止在代码中使用0和NULL。

即使您的代码中没有完美的转发,您调用的代码(例如std :: lib)也很可能会使用它。

答案 2 :(得分:12)

C ++ 11有一个新的文字关键字nullptr。对于像这样的事情,它比0NULL更好,因为在重载解析中它不可能被用作int

if ( nullptr == p )

当然,您可以在bool上下文中使用指针:

if ( !p )

答案 3 :(得分:0)

如果您在2019年遇到同样的问题,则对未分配的指针使用较旧的初始化样式。 2014年8月14日之后,C ++ 11发行了。您使用的编译器可能遵循C ++ 11标准。

  

您可以将0/NULL替换为nullptr

现代C ++提供nullptr作为通用空指针。您应该使用它而不是0 || NULL,因为有些晦涩难懂的机器具有诸如带符号的指针之类的东西,其中空指针实际上类似于-1而不是0。