代码之家  ›  专栏  ›  技术社区  ›  zeus_masta_funk

循环基准的临时基元C++ 11

  •  1
  • zeus_masta_funk  · 技术社区  · 7 年前

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

    #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 post this one ,但我的函数返回对 static 数据。具体来说,我想知道场景是否违反了所述规则中的以下异常:

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

    或者这确实是安全代码。我觉得很安全,但只是想确定一下。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Miles Budnek    7 年前

    是的,这是完全有效和明确的。

    对于虚变量,问题中基于范围的for循环定义如下 range , begin end :

    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;
        }
    }
    

    在应用了引用折叠规则之后, 范围 变成 std::vector<int>& . 这意味着没有临时工被创造出来。循环在中定义的静态向量上迭代 getVec .

    如果 GETVEC 而是按值返回,类型为 范围 会是 std::vector<int>&& ,将应用生存期延长。这将把临时对象的生命周期延长到引用的生命周期,并且所有的东西仍然是完全有效的。