使用std::thread的C++ Lambda引发崩溃的原因及返回行为咨询
问题分析与解答
1. Lambda返回值类型推导的规则
C++中,当Lambda未显式指定返回类型时,编译器会依据return语句推导返回类型:
- 若所有return语句返回同一种类型,就推导出该类型;
- 若存在分支无return语句且该分支可能被执行,会触发未定义行为——你的代码里,
ret == 0的分支没有返回值,但编译器已根据return false;推导出返回类型为bool,此时函数违反了“返回bool类型的函数必须在所有路径返回值”的规则,程序崩溃就是未定义行为的典型表现。
2. std::thread对Lambda返回值的处理
std::thread构造函数接收的可调用对象(包括Lambda),其返回值会被直接忽略——不管Lambda返回什么,std::thread都不会处理或传递该返回值给主线程。
你遇到的问题核心并非std::thread的处理逻辑,而是Lambda本身存在未定义行为:哪怕把这个Lambda直接在主线程调用,同样会触发崩溃或其他异常结果。
3. 添加return true解决问题的原因
添加return true;后,Lambda的所有执行路径都有了明确的bool类型返回值,函数符合类型规则,未定义行为被消除,程序自然恢复正常。
内容的提问来源于stack exchange,提问作者wangjs
相关产品推荐
相关产品推荐

