对bool的空指针的隐式转换

时间:2015-11-02 09:31:58

标签: c++ pointers

假设我有Foo* foo = nullptr;

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

if (!foo)

或者我应该写

if (foo == nullptr)

3 个答案:

答案 0 :(得分:17)

参见本标准参考文献(大胆强调我的):

C ++11§4.12布尔转换

  

算术,无范围枚举,指针或指针的prvalue   成员类型可以转换为bool类型的prvalue。 零值,   null指针值,或null成员指针值转换为   假;任何其他值都转换为true。类型的prvalue   std :: nullptr_t可以转换为bool类型的prvalue;该   结果值是假的。

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

答案 1 :(得分:2)

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

  

空指针常量是一个整数常量表达式(5.19)   整数类型的rvalue,其值为零。

这就是原因,

Foo* foo = nullptr;

就像:

Foo* foo = 0;

此外,在C ++中,零(0)计为布尔值false。因此,您的陈述if (foo == nullptr)有效且与if (!foo)相同。

答案 2 :(得分:0)

array(
  'Comment' => array('joins' => array(
     array(
       'table' => '[222.222.222.222].[db2].[User]',
       'alias' => 'UserJoin',
       'type' => 'INNER',
       'conditions' => array(
         "AND" => array('UserJoin.user_id = Comment.user_id')
       )
     )
   ), 
   'order' => array('Comment.id' => 'desc'),
   'fields' => array('UserJoin.*', 'Comment.*')
))

这很好用。

if (!foo)

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