C++跨线程调用未完全构造对象的成员函数是否符合标准?
待分析代码1(非虚bar版本)
#include <thread> struct S { S() { std::thread t(&S::bar, *this); t.join(); } void bar() { // Do stuff... } }; int main() { S s; }
待分析代码2(虚bar版本)
仅将S的bar成员函数修改为虚函数:
virtual void bar() {
判定结论
- 原始非虚bar版本的代码符合C标准,属于合法代码。C标准规定,构造函数的函数体开始执行时,当前类的所有基类子对象、非静态成员均已完成初始化,当前类的对象生命周期正式启动,允许调用非虚成员函数,代码中线程立即join也不会触发对象生命周期相关的未定义行为。
- 将bar修改为虚函数后,代码依然符合C++标准,没有未定义行为。
- 虚函数场景下bar的调用行为和构造函数内直接调用虚函数的行为完全一致。C++标准明确规定,对象的动态类型在构造函数执行期间被固定为当前正在构造的类的类型,所有虚函数调用都会解析为当前构造类的成员函数实现,该规则不受虚函数调用是直接在构造函数内执行、还是通过构造函数启动的线程间接执行的影响。
内容的提问来源于stack exchange,提问作者Brotcrunsher
相关产品推荐
相关产品推荐

