Ranged base for loop over 临时参考 C++11

Ranged base for loop over temporary reference C++11

我想知道以下是否有效:

#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() 的临时文件的生命周期。我已经查看了两个 and this one,但我的情况有点不同,因为我的函数 returns 是对 static 数据的引用。具体来说,我想知道场景是否违反了规定规则中的以下例外情况:

  • A temporary bound to a reference parameter in a function call [...]

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

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

对于虚变量 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>&&,并且将应用生命周期延长。这会将临时对象的生命周期延长到引用的生命周期,并且一切仍然完全有效。