假设我有Foo* foo = nullptr;
如果我正在检查foo
是否为nullptr
,我是否可以写
if (!foo)
或者我应该写
if (foo == nullptr)
答案 0 :(得分:17)
参见本标准参考文献(大胆强调我的):
C ++11§4.12布尔转换
算术,无范围枚举,指针或指针的prvalue 成员类型可以转换为bool类型的prvalue。 零值, null指针值,或null成员指针值转换为 假;任何其他值都转换为true。类型的prvalue std :: nullptr_t可以转换为bool类型的prvalue;该 结果值是假的。
中间句子是相关的:它告诉你空指针值(foo = nullptr
)可以隐式地转换为false
,bool
本身的类型为{{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)
对于阅读代码的人来说,这看起来会更清楚。