用于循环临时引用C ++ 11的远程基础

时间:2018-05-31 19:08:05

标签: c++ c++11 for-loop static rvalue-reference

我想知道以下内容是否有效:

#include <iostream>
#include <vector>

std::vector<int>& getVec()
{
    static std::vector<int> vec{1, 2, 3, 4, 5};
    return vec;
}

int main()
{
    for (const auto& i : getVec())
    {
        std::cout << "i = " << i << std::endl;
    }
    return 0;
}

基本上我不确定临时来自getVec()的生命周期。我查看了this postthis one,但由于我的函数返回对static数据的引用,因此情况有所不同。具体来说,我想知道场景是否违反了规定的规则中的以下异常:

  
      
  • 临时绑定到函数调用[...]
  • 中的引用参数   

或者如果这确实是安全的代码。我认为这是安全的,但只是想确定。

1 个答案:

答案 0 :(得分:2)

是的,这是完全有效且定义明确的。

对于虚变量rangebeginend,您的问题中基于范围的for循环被定义为与以下内容等效:

auto&& range = getVec();
auto begin = std::begin(range);
auto end = std::end(range);
for (; begin != end; ++begin)
{
    const auto& i = *begin;
    {
        std::cout << "i = " << i << std::endl;
    }
}

应用参考折叠规则后,range的类型变为std::vector<int>&。这意味着永远不会创造临时工。循环遍历getVec中定义的静态向量。

如果getVec改为按值返回,则range的类型将为std::vector<int>&&,并且将应用生命周期延期。这会将临时对象的生命周期延长到引用的生命周期,并且一切仍然完全有效。