为何含虚成员函数的RegBaseA无法统一初始化,RegBaseB却可以?
问题解释
核心原因是C++里聚合类的判定规则在起作用:
C++标准明确要求,聚合类不能包含虚函数、用户自定义构造函数、基类、私有/保护的非静态数据成员等。只有聚合类才能直接用统一初始化列表({})来初始化它的公共成员。
具体看两个结构体:
- RegBaseB:完全符合聚合类的所有条件,没有虚函数,属于聚合类。它里面的匿名union是公共成员,初始化列表
{10}会直接给union里的value成员赋值,所以这种写法合法。 - RegBaseA:因为声明了虚函数
get_num_bits(),直接违反了聚合类的判定要求,所以它不是聚合类。同时这个结构体也没定义能接收int类型参数的构造函数,编译器找不到匹配的初始化方式,因此RegBaseA reg_a {10};会报错。
内容的提问来源于stack exchange,提问作者deponovo
相关产品推荐
相关产品推荐

