列表初始化 - C++14 有什么变化?

pvc*_*pvc 9 c++ language-lawyer list-initialization

在此处输入图片说明这两行来自cppreference

这两种说法有什么区别?我看不出任何区别

直到 C++14

如果花括号初始化列表为空并且 T 是具有默认构造函数的类类型,则执行值初始化。否则,如果 T 是聚合类型,则执行聚合初始化。

从 C++14 开始

如果 T 是聚合类型,则执行聚合初始化。否则,如果花括号初始化列表为空并且 T 是具有默认构造函数的类类型,则执行值初始化。

Dav*_*ing 3

区别在于,当两个条件都适用时会发生哪一种情况:如果T是一个聚合类(而不是数组),它肯定有一个默认构造函数,并且花括号初始化列表为空。当然,为了理解为什么这很重要,我们必须区分值初始化和空列表的聚合初始化。

值初始化对对象进行零初始化,然后对其进行默认初始化,这对于聚合来说是对其每个成员进行默认初始化,因此值初始化是按成员进行的(加上零填充)。聚合初始化从 中初始化每个成员{},这又是许多类型的值初始化,但是使用用户提供的默认构造函数的类类型成员的默认初始化。差异可以看出

struct A {A() {} int i;};
struct B {A a;};  // aggregate
B b{};     // i is 0 in C++11, uninitialized in C++14
B b2=B();  // i is 0 in both versions
Run Code Online (Sandbox Code Playgroud)

仅在 C++14 中,聚合可以具有默认成员初始值设定项;当然,这不会导致两种语言版本之间的行为差​​异,但无论如何,这两种规则之间的行为并没有不同(因为它仅替换常见的默认初始化)。