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

这是绑定到要改变的非rvo返回值的惯用方法吗?

  •  3
  • lubgr  · 技术社区  · 6 年前

    auto f()
    {
        std::vector<int> v1 { 3, 2, 1 };
        std::vector<int> v2 { 2, 1, 3 };
    
        /* RVO impossible. */
        return someRuntimeCondition ? v1 : v2;
    }
    

    auto&& vec = f(); /* Extend lifetime to current scope. */
    
    std::sort(vec.begin(), vec.end()); /* Const-lvalue ref. was no option. */
    

    这应该避免在本地 std::vector f() 如此罕见的依赖于RVO是更惯用的apprach?

    F()。

    2 回复  |  直到 6 年前
        1
  •  3
  •   M.M    6 年前

    • auto a = f();
    • auto&& a = f();

    除了结果 decltype(a) a 在这两种情况下,结果对象都由 return


    在C++ 17之前,结果对象总是临时的。 复制已初始化

    有些人确实使用了这种做法

    就我个人而言,我使用前者是因为我使用C++ 17,甚至在此之前我只使用了最大拷贝删除的编译器。除了在调试模式下运行的旧版本的MSVC之外,我实际上不知道有任何编译器没有在这里执行复制省略。

        2
  •  2
  •   Galik    6 年前

    auto f()
    {
        std::vector<int> v1 { 3, 2, 1 };
        std::vector<int> rv { 2, 1, 3 }; // return value
    
        if(someRuntimeCondition)
            std::swap(v1, rv);
    
        return rv;
    }
    

    auto f()
    {
        std::vector<int> v1 { 3, 2, 1 };
        std::vector<int> v2 { 2, 1, 3 };
    
        return std::vector<int>{std::move(someRuntimeCondition ? v1 : v2)};
    }
    

    C++17 rvo,在运行时将任何向量移动到调用方堆栈上。