【问题标题】:How do Range-Based for loops handle temporary containers [duplicate]基于范围的for循环如何处理临时容器[重复]
【发布时间】:2023-03-19 06:23:02
【问题描述】:

假设这个例子:

vector<int> get_vector();
for(auto& v: get_vector())
{
 ...
}

get_vector() 是否在每次迭代中重新评估?还是临时存储和评估一次?

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    get_vector() 被计算一次,结果存储在一个临时文件中。

    6.5.4/1 ...基于范围的 for 语句等效于

    {
      auto && __range = range-init;
      for ( auto __begin = begin-expr,
                 __end = end-expr;
           __begin != __end;
           ++__begin ) {
        for-range-declaration = *__begin;
        statement
      }
    }
    

    在您的示例中,range-init 将是 (get_vector())

    【讨论】:

    • 谢谢伊戈尔。这个片段出自哪里?标准?
    • 是的,C++ 标准。 6.5.4/1 是章节和段落编号(有时称为“章和节”)。
    • 是的,我想开始学习如何钓鱼 :)
    • 重要的是要注意临时是通过绑定到引用 (auto &amp;&amp; __range) 来延长生命周期的。
    猜你喜欢
    • 2017-11-04
    • 2018-12-28
    • 2022-06-26
    • 2016-10-31
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多