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