pvc*_*pvc 9 c++ language-lawyer list-initialization
这两行来自cppreference
这两种说法有什么区别?我看不出任何区别
直到 C++14
如果花括号初始化列表为空并且 T 是具有默认构造函数的类类型,则执行值初始化。否则,如果 T 是聚合类型,则执行聚合初始化。
从 C++14 开始
如果 T 是聚合类型,则执行聚合初始化。否则,如果花括号初始化列表为空并且 T 是具有默认构造函数的类类型,则执行值初始化。
区别在于,当两个条件都适用时会发生哪一种情况:如果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 中,聚合可以具有默认成员初始值设定项;当然,这不会导致两种语言版本之间的行为差异,但无论如何,这两种规则之间的行为并没有不同(因为它仅替换常见的默认初始化)。