带成员初始化器的类成员在构造函数初始化列表中是否重复初始化及值分析
问题解答
一、成员初始化器与构造函数初始化列表的执行规则
当类成员同时拥有类内默认初始化器,且被写入构造函数的初始化列表时,构造函数初始化列表的初始化逻辑会完全覆盖类内的默认初始化——成员不会被重复初始化,只会执行初始化列表中的操作,类内的默认初始化不会生效。
二、示例代码中isSomething的最终值分析
首先明确执行顺序:构造函数初始化列表调用isSomthingFunc()时,isSomething尚未完成任何初始化操作(成员初始化严格按照类内声明顺序执行,此处初始化列表中对isSomething的初始化依赖了自身,此时该成员处于未初始化状态)。
1. isSomthingFuncExt()为非constexpr的情况
此时isSomthingFunc()在运行时执行,访问未初始化的isSomething属于未定义行为——程序可能返回任意布尔值,isSomething的最终结果完全不可预测,甚至可能触发程序崩溃。
2. isSomthingFuncExt()为constexpr的情况
若isSomthingFunc()和isSomthingFuncExt()都被编译器判定为constexpr函数,编译期求值时会发现代码访问了未初始化的变量,这违反了constexpr函数的求值规则,因此会直接触发编译错误,程序无法通过编译,不存在运行时的最终值。
额外说明:如果代码意图是让isSomthingFunc()使用类内默认的true值,这个逻辑是错误的——因为初始化列表的初始化还未完成,此时isSomething并未被赋值,无法获取到默认的true。
内容的提问来源于stack exchange,提问作者Guy Sadoun
相关产品推荐
相关产品推荐

