【发布时间】:2021-06-24 08:26:42
【问题描述】:
struct A
{
int a;
int b;
void foo(){}
};
A a{1, 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
标签: c++ c++11 struct constructor initialization