首页 > 解决方案 > std::move 参数按值传递

问题描述

我需要一些关于这段代码的帮助:

void foo(std::promise<std::string> p) {
    try {
        std::string result = "ok";
        p.set_value(std::move(result));
    } catch (...) {
        std::current_exception();
    }

}

int main() {
    std::promise<std::string> promise;
    std::future<std::string> f = promise.get_future();
    std::thread t(foo, std::move(promise));
    t.detach();

    std::string res = f.get();

    return 0;
}

std::move() 用法的含义是什么?是p按值传递的(所以是副本)?

标签: c++parameter-passingmove-semantics

解决方案


p是内部的局部变量foo。Beforefoo被调用,p必须被创建。创建它有两种可能性:通过复制构造函数或移动构造函数。std::promise是可移动的类,不能复制。所以创建它的唯一方法是调用promise(promise&&)- 移动构造函数。经过

std::move(promise)

您正在转换ppromise&&,然后编译器可以选择从 mainpromise(promise&&)移动到inside 。promisepfoo

所以这里没有复制promise


推荐阅读