15
鑑於這種C++ 11示例的代碼:C++ 11基於範圍的for()循環評估一次或多次?
for (const auto &foo : bar())
{
// ... do something with foo...
}
是否保證由標準,在該示例中,表達式bar()
只計算一次?
或者它可能最終被稱爲在循環的每一次迭代?
鑑於這種C++ 11示例的代碼:C++ 11基於範圍的for()循環評估一次或多次?
for (const auto &foo : bar())
{
// ... do something with foo...
}
是否保證由標準,在該示例中,表達式bar()
只計算一次?
或者它可能最終被稱爲在循環的每一次迭代?
它只被評估一次。該標準認爲,對於環路基於範圍的等效於此:
§6.5.4範圍爲基礎的聲明 [stmt.ranged]
{
auto && __range = range-init;
for (auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin) {
for-range-declaration = *__begin;
statement
}
}
與range-init
等同於(bar())
您的情況(您指定的表達式,括號括起來)。您只能看到該表達式的一次評估。