10

我只是有点困惑。

什么时候应该使用 nullptr?

我在一些网站上读到应该始终使用它,但我不能为非指针设置 nullptr,例如:

int myVar = nullptr; // Not a pointer ofcourse

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

感谢任何帮助!我对 c++ 11(以及整体的 c++)非常陌生。

4

2 回答 2

11

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

[lex.nullptr] 第 1 段

指针文字是关键字 nullptr。它是 std::nullptr_t 类型的纯右值。[注意:std::nullptr_t 是一个独特的类型,既不是指针类型也不是指向成员类型的指针;相反,这种类型的纯右值是一个空指针常量,可以转换为空指针值或空成员指针值。[...] — 结束注 ]

现在开始使用NULL.

根据同一草案,定义如下。

[diff.null] 第 1 段

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

空指针常量如下。

[conv.ptr] 第 1 段

空指针常量是整数类型的整数常量表达式 [...] 纯右值,其计算结果为零或 std::nullptr_t 类型的纯右值。

也就是说,无论是定义为一个整数纯右值,还是一个类型为 的纯右值,都是实现定义的行为。如果标准库的给定实现选择前者,则可以分配给整数类型,并保证将其设置为零,但如果选择后者,则允许编译器发出错误并声明程序不正确-形成。NULLstd::nullptr_tNULL

换句话说,虽然条件有效 [ read IB ],但使用初始化整数NULL很可能是个坏主意,只需使用 0 代替。

另一方面,根据上述NULL保证将指针初始化为空指针值,就像这样nullptr做一样,但是 whileNULL是一个宏,伴随着几个警告,nullptr是特定类型的纯右值,适用于类型检查和转换规则. 这就是为什么nullptr应该首选的原因。

于 2013-09-12T22:10:17.340 回答
2

考虑两个函数重载:

void foo(int)
void foo(int*)

在 C++ 中,人们倾向于将0其用作空值。其他人使用NULL. (NULL实际上只是一个花哨的宏0

如果您调用foo(0)or foo(NULL),则应该调用哪个变得模棱两可。foo(nullptr)消除了这种歧义,并且将始终调用foo(int*).

于 2013-09-12T22:10:54.547 回答