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

Zhe*_*hen 17 c++ pointers c++11

如今,使用C++ 11,Whats建议使用,Zero还是NULL?第二个如果?

int * p = getPointer();

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

if( NULL == p ){
    // something
}
Run Code Online (Sandbox Code Playgroud)

更新:我忘了新的

if( nullptr == p ){
    // something
}
Run Code Online (Sandbox Code Playgroud)

更新2:示例是显示写入空指针的选项,我知道编写起来比较愉快if( !p ).

Luc*_*ore 29

也不是,它是nullptr.

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

if ( !p ){
   //something
}
Run Code Online (Sandbox Code Playgroud)

2.14.7指针文字[lex.nullptr]

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

  • '!p`为+1.我发现`if(p)`和`if(!p)`比更多罗嗦的替代品更容易阅读. (4认同)
  • 你把条件颠倒了。这就是为什么我认为最好写`p == nullprt`和`p != nullptr` (2认同)

How*_*ant 28

其他答案是对的.但是我想多说一下为什么 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);
}
Run Code Online (Sandbox Code Playgroud)

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

int
long
std::nullptr_t
Run Code Online (Sandbox Code Playgroud)

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

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

即使您的代码中没有完美的转发,您调用的代码(例如std :: lib)很可能在封面下使用它.

  • 请注意,GCC可以选择使用-Wzero-as-null-pointer-constant进行警告."当文字'0'用作空指针常量时发出警告.这对于促进在C++ 11中转换为nullptr很有用." http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html (5认同)
  • 为"*在代码中积极禁止使用0和NULL." (3认同)

asc*_*ler 12

C++ 11有一个新的文字关键字nullptr.这是优于0NULL这样的事情,因为没有机会,它会被用作int重载决策.

if ( nullptr == p )
Run Code Online (Sandbox Code Playgroud)

或者当然你可以在bool上下文中使用指针:

if ( !p )
Run Code Online (Sandbox Code Playgroud)