用虚函数初始化结构
Posted
技术标签:
【中文标题】用虚函数初始化结构【英文标题】:Brace Initialize struct with virtual functions 【发布时间】:2021-06-24 08:26:42 【问题描述】:Brace initialization
struct A
int a;
int b;
void foo()
;
A a1, 2;
它工作正常。但是如果把 foo 改成虚函数,就不会编译出错了,
错误 C2440“正在初始化”:无法从“初始化程序列表”转换为
我找到this,
聚合是没有用户提供的数组或类(第 9 条) 构造函数(12.1),没有私有或受保护的非静态数据成员 (第 11 条),无基类(第 10 条),无虚函数 (10.3)。
但这背后的原因是什么?
【问题讨论】:
我可能完全错了,但我知道你发布的链接中提到的一些东西,比如虚拟方法、私有或受保护的非静态、基类,......可以(或真的 100 % do) 更改内存中对象的布局(添加 vptr、privates 和 protected 可能会被编译器重新排列 - 其中任何一个也会破坏std::is_standard_layout<T>
。所以也许这不会允许聚合按预期工作. 用户提供的构造函数是另一回事 - 对我来说这是关于如何在它和聚合 init 之间进行选择。您可以使用 initializer_list 添加一个 ctor
【参考方案1】:
你为什么不使用带有virtual void foo()
的参数化构造函数
struct A
int a;
int b;
A(int a, int b)
this->a = a;
this->b = b;
virtual void foo()
;
A a 1, 2 ;
【讨论】:
这个构造函数的想法还不错,但我更喜欢:A(int a, int b): a(a), b(b)
,即更喜欢初始化器而不是赋值(尽管它可能不会对int
s 产生影响)。以上是关于用虚函数初始化结构的主要内容,如果未能解决你的问题,请参考以下文章