为何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
相关产品推荐
相关产品推荐

