C++ 11-一直使用nullptr?

use*_*429 8 pointers nullptr c++11

我只是有点困惑.

我什么时候应该使用nullptr?

我已经在一些网站上看到应该总是使用它,但是我不能为非指针设置nullptr,例如:

int myVar = nullptr; // Not a pointer ofcourse
Run Code Online (Sandbox Code Playgroud)

我应该总是使用NULL非指针和nullptr指针吗?

感谢任何帮助!我对c ++ 11(和c ++整体)很新.

bru*_*tra 9

始终nullptr在初始化指向空指针值的指针时使用,这就是根据草案n3485的含义.

[lex.nullptr]第1段

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

现在就使用了NULL.

根据同一草案,其定义如下.

[diff.null]第1段

宏NULL,[...]是 本国际标准中实现定义的C++空指针常量.

null指针常量如下.

[conv.ptr]第1段

空指针常数是整数表达式[...]的计算结果为零或类型的std的prvalue :: nullptr_t整型prvalue.

也就是说,它是实现定义的行为,无论NULL是定义为求值为零的整数prvalue还是类型的prvalue std::nullptr_t.如果标准库的给定实现选择前者,则NULL可以将其分配给整数类型,并保证将其设置为零,但如果选择了后者,则允许编译器发出错误并声明程序生病-formed.

换句话说,尽管有条件有效[ 读取IB ],但使用初始化整数NULL可能是一个坏主意,只需使用0即可.

另一方面,根据上面NULL保证初始化指向空指针值的指针,很像nullptr,但是虽然NULL是一个宏,伴随着几个警告,nullptr是特定类型的prvalue,适用于类型检查和转换规则.这主要是为什么nullptr应该首选.

  • 实际上,我有点不对劲.从C++ 11开始,"空指针常量"的定义也允许类型为`nullptr_t`的表达式,因此`#define NULL nullptr`现在似乎是有效的.这意味着`int a = NULL;`,如果被编译器接受,仍然必须将`a`设置为'0`,但不再需要接受,编译器可能会给出一个硬错误. (3认同)
  • @brunocodutra反过来说,求值为零的整型常量表达式是一个空指针常量,而类型为`std :: nullptr_t`的prvalue也是一个空指针常量.明确需要空指针常量来支持转换为指针类型和`bool`,但不支持转换为其他类型,除非出于其他原因需要.那些其他原因确实存在于`0`(它已经是`int`,所以它可以赋值给`int`),但不适用于`nullptr`(因此标准中没有任何内容表明它可以转换为`int`). (2认同)