虚拟成员函数不允许统一初始化 [duplicate]

Virtual member function disallow uniform initialization [duplicate]

提问人:deponovo 提问时间:11/17/2023 最后编辑:deponovo 更新时间:11/18/2023 访问量:78

问:

为什么默认初始化是可能的,但不能:RegBaseBRegBaseA

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};
}
C++语言

评论

1赞 Oersted 11/17/2023
我的猜测:聚合初始化但添加虚拟函数会使 RegBaseA 不是聚合。
1赞 user12002570 11/17/2023
这与工会无关。
0赞 Scheff's Cat 11/17/2023
@user12002570 你是对的:coliru 匿名工会在某种程度上具有误导性...... :-)
0赞 user12002570 11/17/2023
@Scheff'sCat:我们是不是应该让标题更符合实际问题?比如:“虚函数使类非聚合”或类似的东西。
0赞 Scheff's Cat 11/17/2023
@user12002570恕我直言,重复项的标题足以在谷歌搜索中触发。如果走错了路,标题可能对人们(像我一样)有好处...... ;-)

答:

-1赞 possum 11/17/2023 #1

您所拥有的简单初始化之所以能够使用,是因为编译器不需要“执行”任何操作来设置它。在写入二进制文件之后,无需计算或初始化值。 与旧的 C 风格的“普通旧数据类型”非常相似,它们只是内存中的固定布局。BB

A确实有效,因为它需要设置一个动态(读取“运行时”)调度表,以便在声明时找出正确的函数。virtual

4赞 Oersted 11/17/2023 #2

RegBaseB满足聚合初始化的标准,但不符合具有虚拟功能的标准。RegBaseA

由于您声明了没有特殊构造函数,因此编译器正在尝试聚合初始化,此处将其识别为聚合初始化。RegBaseB reg_b {10};

评论

0赞 deponovo 11/17/2023
谢谢。我现在在文档中看到.我在哪里可以进一步研究为什么会这样?An aggregate is one of the following types: [...] no virtual member functions