c++ - 为什么构造 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()
作为右值传递(移动)。所以,我期望一个副本构造和一个移动构造。
为什么会有二期建设?
解决方案
您将参数传递给func
应该构成第二步的值。显然std::thread
,在调用之前再将其存储在内部一次func
,就标准而言,AFAIK 是绝对合法的。
推荐阅读
- python - python - list.append() 返回一个空字符串
- visual-studio - 我们可以使用 VS 获取 TFS 凭据吗?
- html - 如何在 ReactJS JSX 中使用具有无值属性的 var 元素?
- html - 为什么我的项目在 Flexbox 导航栏中没有水平对齐?
- python - 日历 API 无法创建会议链接,python
- python - 将文本文件转换为字符串或列表
- webpack - 无法将 Saxon-JS 2 与 Webpack 一起使用
- javascript - 尝试更改语言后jQuery datepicker不显示
- javascript - 使用正则表达式解析 CSV
- autodesk-forge - 金属材料在 Forge 模型查看器中不起作用