You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何std::thread在不可拷贝限制下仍能被函数返回?

为什么返回std::thread左值却能编译通过?

你困惑的点在于std::thread不可拷贝,但返回局部左值t却没报错,核心原因是C++的返回值优化和移动语义在起作用:

  • 优先触发返回值优化(RVO):当函数返回自身作用域内的局部非静态对象时,编译器会直接在调用者(这里是main函数)的栈帧上构造该对象,完全跳过拷贝或移动步骤。这是C++标准允许的优化,不管对象能不能拷贝,只要构造合法就能这么干。
  • 退而求其次的移动语义:就算编译器没做RVO优化,C++11及以后的标准规定,这种返回局部对象的场景会自动把左值t转换成右值,触发std::thread的移动构造函数。std::thread虽然禁用了拷贝构造,但提供了移动构造——它会把线程的所有权从t转移给返回值,而不是创建新的线程副本。

你可以做个小测试验证:

// 这行代码会编译失败,因为拷贝构造被禁用
std::thread t2 = t;
// 这行代码合法,因为用了移动语义
std::thread t2 = std::move(t);

你的代码示例:

#include <thread>

void some_other_function(int) {
    return;
}
std::thread g()
{
    std::thread t(some_other_function,42);
    return t;
}

int main() {
    g();
    return 0;
}

内容的提问来源于stack exchange,提问作者ConnellyM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 17:14:56