【问题标题】:How to return std::vector from a function using C++11 move semantics?如何使用 C++11 移动语义从函数返回 std::vector?
【发布时间】:2015-04-11 15:15:57
【问题描述】:

我知道 C++11 具有来自此链接的移动语义: Elements of Modern C++ Style

但它没有介绍如何使用移动语义返回向量。如何做到这一点?

【问题讨论】:

    标签: c++ c++11 move-semantics copy-elision


    【解决方案1】:

    像这样:

    std::vector<std::string> make_a_vector_of_strings()
    {
        std::vector<std::string> result;
    
        // just an example; real logic goes here
        result.push_back("Hello");
        result.push_back("World");
    
        return result;
    }
    

    return 语句的操作数符合复制省略的条件,如果复制没有省略,则该操作数被认为是返回类型的移动构造函数,所以一切都尽可能好。

    【讨论】:

    • 我看到一些帖子说使用 std::vector<:string> && 作为返回类型,或返回移动(结果)。所有这些都让我感到困惑!
    • @DeanChen:这两个想法听起来都完全错误。
    • 我认为您应该限定 result 仅在返回语句中移动,因为它是局部变量/参数。如果result 是数据成员(或全局,eww),则不会移动。
    • @dyp: 如果result 不是局部变量,代码仍然会做正确的事情,因为那时它会被别名,我们不想在没有别名的情况下偷偷地改变别名值明确要求这样做。
    • 确实如此,但我担心您的回答可能会被误解:人们可能认为返回语句总是移动其操作数。
    猜你喜欢
    • 2011-09-06
    • 2016-11-11
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2022-10-21
    • 1970-01-01
    • 2013-10-17
    相关资源
    最近更新 更多