我只是有点困惑。
什么时候应该使用 nullptr?
我在一些网站上读到应该始终使用它,但我不能为非指针设置 nullptr 例如:
int myVar = nullptr; // Not a pointer ofcourse
我应该始终使用 NULL 非指针并使用 nullptr 作为指针吗?
感谢任何帮助!我对 c++ 11(以及整个 c++)非常陌生。
在初始化指向
空指针值时始终使用
nullptr
,这就是根据草案n3485的含义。
[lex.nullptr] 第 1 段
指针字面量是关键字 nullptr。它是类型的纯右值 std::nullptr_t。 [ 注意:std::nullptr_t 是一个不同的类型, 既不是指针类型也不是指向成员类型的指针;相反,纯右值 该类型是空指针常量,可以转换为 空指针值或空成员指针值。 [...] — 尾注]
现在开始使用
NULL
。
根据同一草案,其定义如下。
[diff.null] 第 1 段
宏 NULL, [...] 是一个 实现定义的 C++ 空指针常量在此 国际标准。
和空指针常量如下。
[conv.ptr] 第 1 段
A 空指针常量 是一个整型常量表达式 [...] 计算结果为零的整数类型纯右值或类型的纯右值 std::nullptr_t。
也就是说,实现定义的行为是否将
NULL
定义为计算为零的整数纯右值,还是std::nullptr_t
类型的纯右值。如果标准库的给定实现选择前者,则 NULL
可以分配给整数类型,并且保证它将设置为零,但如果选择后者,则允许编译器发出错误并声明该程序格式不正确。
换句话说,虽然有条件有效 [read IB],但使用
NULL
初始化整数很可能是一个坏主意,只需使用 0 即可。
另一方面,根据上面的内容,
NULL
保证初始化指向空指针值的指针,就像nullptr
所做的那样,但是虽然NULL
是一个宏,但伴随着一些警告,nullptr
是特定类型的纯右值,适用类型检查和转换规则。这就是为什么应该优先选择 nullptr
的主要原因。
考虑两个函数重载:
void foo(int)
void foo(int*)
在 C++ 中,人们倾向于使用
0
作为空值。其他人使用NULL
。 (NULL
实际上只是 0
的一个奇特宏)
如果您调用
foo(0)
或 foo(NULL)
,则应该调用哪一个就变得不明确了。 foo(nullptr)
消除了这种歧义,并且永远会打电话给foo(int*)
。