【发布时间】:2015-11-02 09:31:58
【问题描述】:
假设我有Foo* foo = nullptr;
如果我正在检查 foo 是否为 nullptr,我是否可以写
if (!foo)
或者我应该写
if (foo == nullptr)
【问题讨论】:
-
两者都很好,更多的是编码风格问题。遵循现有代码的风格,或者如果你的代码使用对你来说更清晰。
假设我有Foo* foo = nullptr;
如果我正在检查 foo 是否为 nullptr,我是否可以写
if (!foo)
或者我应该写
if (foo == nullptr)
【问题讨论】:
请参阅此标准参考(我的粗体强调):
C++11 §4.12 布尔转换
算术、无范围枚举、指针或指向的指针的纯右值 成员类型可以转换为布尔类型的纯右值。 零值, 空指针值,或空成员指针值转换为 错误的;任何其他值都将转换为 true。 类型的纯右值 std::nullptr_t 可以转换为 bool 类型的纯右值;这 结果值为假。
中间的句子是相关的:它告诉您空指针值 (foo = nullptr)可以 隐式转换为 false,而 false 本身的类型为 bool。因此if (!foo) 是明确定义的。
【讨论】:
在C++中,空指针定义为
空指针常量是一个整数常量表达式 (5.19) 计算结果为零的整数类型的右值。
这就是为什么,
Foo* foo = nullptr;
就像:
Foo* foo = 0;
此外,在 C++ 中,零 (0) 算作布尔值 false。所以你的声明if (foo == nullptr) 是有效的,和if (!foo) 一样。
【讨论】:
if (!foo)
这很好用。
if (foo == nullptr)
这对于阅读您的代码的人来说会更清楚。
【讨论】: