假设我有一个返回std::vectorby值的函数:
std::vector<int> buildVector();
Run Code Online (Sandbox Code Playgroud)
使用基于范围的迭代迭代结果似乎很自然for:
for (int i : buildVector()) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
问题:这样做是否安全?
我对标准的阅读(实际上,草案n4431)表明它可能不是,尽管我很难相信委员会未能允许这种用法.我希望我的阅读不正确.
6.5.4节定义了基于范围的for:
for ( for-range-declaration : expression ) statement
Run Code Online (Sandbox Code Playgroud)
与以下desugaring:
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
Run Code Online (Sandbox Code Playgroud)
其中range-init只是( expression ),和至少为类类型,begin-expr或者是__range.begin()或begin(__range)等
在我的buildVector例子中,我认为range-init生成一个临时的,允许实现在__range绑定引用后立即销毁.这意味着在评估__range …