首页 > 解决方案 > 为什么构造 std::thread 时参数移动了两次

问题描述

考虑这个程序,它本质上创建了std::thread调用作为参数的函数:func()arg

#include <thread>
#include <iostream>

struct foo {
   foo() = default;
   foo(const foo&) { std::cout << "copy ctor" << std::endl; }
   foo(foo&&) noexcept { std::cout << "move ctor" << std::endl; }
};

void func(foo){}

int main() {
   foo arg;
   std::thread th(func, arg);
   th.join();
}

我的输出是

copy ctor
move ctor
move ctor

据我了解arg,在线程对象内部复制,然后func()作为右值传递(移动)。所以,我期望一个副本构造一个移动构造

为什么会有二期建设?

标签: c++c++11movestdthread

解决方案


您将参数传递给func应该构成第二步的值。显然std::thread,在调用之前再将其存储在内部一次func,就标准而言,AFAIK 是绝对合法的。


推荐阅读