我只是有点困惑。
什么时候应该使用 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 段
空指针常量是整数类型的整数常量表达式 [...] 纯右值,其计算结果为零或 std::nullptr_t 类型的纯右值。
也就是说,无论是定义为一个整数纯右值,还是一个类型为 的纯右值,都是实现定义的行为。如果标准库的给定实现选择前者,则可以分配给整数类型,并保证将其设置为零,但如果选择后者,则允许编译器发出错误并声明程序不正确-形成。NULL
std::nullptr_t
NULL
换句话说,虽然条件有效 [ read IB ],但使用初始化整数NULL
很可能是个坏主意,只需使用 0 代替。
另一方面,根据上述NULL
保证将指针初始化为空指针值,就像这样nullptr
做一样,但是 whileNULL
是一个宏,伴随着几个警告,nullptr
是特定类型的纯右值,适用于类型检查和转换规则. 这就是为什么nullptr
应该首选的原因。
考虑两个函数重载:
void foo(int)
void foo(int*)
在 C++ 中,人们倾向于将0
其用作空值。其他人使用NULL
. (NULL
实际上只是一个花哨的宏0
)
如果您调用foo(0)
or foo(NULL)
,则应该调用哪个变得模棱两可。foo(nullptr)
消除了这种歧义,并且将始终调用foo(int*)
.