小编mbr*_*knl的帖子

使用带有rvalue range-init的C++ 11基于范围的for循环是否安全?

假设我有一个返回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 …

c++ foreach c++11

29
推荐指数
1
解决办法
2770
查看次数

标签 统计

c++ ×1

c++11 ×1

foreach ×1