より正確に言うと、標準は次のように述べています。
6.4 選択ステートメント
選択ステートメント:
if ( condition ) statement
… 条件の規則は、選択ステートメントと and ステートメントの両方に適用されますfor
( while
6.5)。… switch ステートメント以外のステートメントで初期化された宣言である条件の値は、文脈的に変換された宣言された変数の値ですbool
(節 4)。その変換の形式が正しくない場合、プログラムの形式が正しくありません。… 式である条件の値は、式の値であり、文脈上;に変換されます。bool
その変換の形式が正しくない場合、プログラムは形式が正しくありません。
ブール値への変換の意味:
4 標準変換
特定の言語構造では、式をブール値に変換する必要があります。e
そのようなコンテキストに現れる式は、何らかの発明された一時変数 t (8.5) に対して、宣言が整形式であるbool
場合にのみ、
文脈的に変換され、整形式であると言われます。bool t(e);
これは重要。そのため、この種の「魔法」を行うことができます。
while(getline(cin,str))) cout<<str;
with が適用されますbool(cin)
(この場合はgetline
return cin
))
あなたの例では、変換は次のようになります。
4.12 ブール変換 [conv.bool]
1 算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、 type の prvalue に変換できますbool
。ゼロ値、ヌル ポインター値、またはヌル メンバー ポインター値は に変換されfalse
ます。その他の値は に変換されtrue
ます。直接初期化 (8.5) では、 type の prvalue を typestd::nullptr_t
の prvalue に変換できます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