【问题标题】:Implicit cast of null pointer to bool将空指针隐式转换为 bool
【发布时间】:2015-11-02 09:31:58
【问题描述】:

假设我有Foo* foo = nullptr;

如果我正在检查 foo 是否为 nullptr,我是否可以写

if (!foo)

或者我应该写

if (foo == nullptr)

【问题讨论】:

  • 两者都很好,更多的是编码风格问题。遵循现有代码的风格,或者如果你的代码使用对你来说更清晰。

标签: c++ pointers


【解决方案1】:

请参阅此标准参考(我的粗体强调):

C++11 §4.12 布尔转换

算术、无范围枚举、指针或指向的指针的纯右值 成员类型可以转换为布尔类型的纯右值。 零值, 空指针值,或空成员指针值转换为 错误的;任何其他值都将转换为 true。 类型的纯右值 std::nullptr_t 可以转换为 bool 类型的纯右值;这 结果值为假。

中间的句子是相关的:它告诉您空指针值 (foo = nullptr)可以 隐式转换为 false,而 false 本身的类型为 bool。因此if (!foo) 是明确定义的。

【讨论】:

    【解决方案2】:

    在C++中,空指针定义为

    空指针常量是一个整数常量表达式 (5.19) 计算结果为零的整数类型的右值。

    这就是为什么,

    Foo* foo = nullptr;
    

    就像:

    Foo* foo = 0;
    

    此外,在 C++ 中,零 (0) 算作布尔值 false。所以你的声明if (foo == nullptr) 是有效的,和if (!foo) 一样。

    【讨论】:

      【解决方案3】:
      if (!foo)
      

      这很好用。

      if (foo == nullptr)
      

      这对于阅读您的代码的人来说会更清楚。

      【讨论】:

        猜你喜欢
        • 2012-10-24
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        相关资源
        最近更新 更多