为了更准确:标准说:
6.4 选择声明
选择声明:
if ( condition ) statement
……条件规则既适用于选择语句,也适用于for
andwhile
语句(6.5)。...条件的值是在除 switch 语句之外的语句中的初始化声明,是上下文转换为的声明变量的值bool
(第 4 条)。如果该转换格式不正确,则程序格式错误。… 作为表达式的条件的值是表达式的值,根据上下文转换为bool
; 如果该转换格式不正确,则程序格式错误。
转换为 bool 的意思是:
4 标准转换
某些语言结构要求将表达式转换为布尔值。对于某些发明的临时变量 t (8.5),当且仅当
声明格式正确时,出现在这种上下文中的表达式e
被称为上下文转换并格式正确。bool
bool t(e);
这个很重要。这就是为什么你可以做这种“魔术”:
while(getline(cin,str))) cout<<str;
with 将适用bool(cin)
(在这种情况下getline
返回cin
))
在您的示例中,转换将是:
4.12 布尔转换 [conv.bool]
1 算术、无作用域枚举、指针或指向成员类型的指针的纯右值可以转换为类型的纯右值bool
。零值、空指针值或空成员指针值转换为false
; 任何其他值都转换为true
. 对于直接初始化(8.5),类型的纯右值std::nullptr_t
可以转换为类型的纯右值bool
;结果值为false
。
顺便说一句,if
您的示例中的 很有可能几乎没有用,甚至只是混淆了代码。考虑:
for (int i=0; i< data->tokens.size(); ++i)
{..
//reads a token and assigns to a variable...
}
或者:
for( const auto &token : data->tokens)
{..
// assigns token to a variable...
}
在这两种情况下,for
只有在size()>0
使多余的if
.