是否应该始终使用 NULL 或 nullptr 初始化变量?

问题描述 投票:0回答:2

我只是有点困惑。

什么时候应该使用 nullptr?

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

int myVar = nullptr; // Not a pointer ofcourse

我应该始终使用 NULL 非指针并使用 nullptr 作为指针吗?

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

c++11 pointers initialization nullptr
2个回答
11
投票

在初始化指向

空指针值
时始终使用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
的主要原因。


2
投票

考虑两个函数重载:

void foo(int)
void foo(int*)

在 C++ 中,人们倾向于使用

0
作为空值。其他人使用
NULL
。 (
NULL
实际上只是
0
的一个奇特宏)

如果您调用

foo(0)
foo(NULL)
,则应该调用哪一个就变得不明确了。
foo(nullptr)
消除了这种歧义,并且永远会打电话给
foo(int*)

© www.soinside.com 2019 - 2024. All rights reserved.