c++ 虚成员函数不允许统一初始化[重复]

vwoqyblh  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(103)

此问题在此处已有答案

In C++, why do virtual functions disqualify class type as aggregate? [duplicate](1个答案)
C++ aggregates have no virtual functions?(2个答案)
昨天就关门了。
默认初始化在RegBaseB中是可能的,而在RegBaseA中是不可能的原因是什么?

struct RegBaseA
{
    union {unsigned int value;};
    virtual unsigned int get_num_bits() const {return 32;};
};

struct RegBaseB
{
    union {unsigned int value;};
};

int main()
{
    // RegBaseA reg_a {10}; // not allowed
    RegBaseB reg_b {10};
}

字符串

tjrkku2a

tjrkku2a1#

RegBaseB满足aggregate initialization的标准,但不满足具有虚函数的RegBaseA的标准。
由于没有声明特殊的构造函数,编译器正在尝试聚合初始化,在这里被识别为RegBaseB reg_b {10};

nfg76nw0

nfg76nw02#

B中的初始化是可以使用的,因为编译器不需要“做”任何事情来设置它。在编写二进制文件之后,没有计算或初始化值的工作。B非常类似于旧的C风格的“普通旧数据类型”,只是内存中的固定布局。
A确实可以工作,因为它需要一个动态的(读作“运行时”)调度表来确定正确的函数,因为它被声明为virtual

相关问题