从 C++11 开始,对于列表初始化 http://en.cppreference.com/w/cpp/language/list_initialization,
If T
是聚合类型,则执行聚合初始化。
并使用 C++11总计的 http://en.cppreference.com/w/cpp/language/aggregate_initialization是以下类型之一:
...
类类型(通常是结构或联合),具有
这意味着从 C++11 开始,显式删除构造函数的类仍被视为聚合类型,然后允许聚合初始化。
而效果是:
Each direct public base, (since C++17)
数组元素或非静态类成员,按照数组下标/在类定义中出现的顺序,从初始化列表的相应子句中进行复制初始化。
请注意,对于DefaultPrivate y{10};
,在上面的过程中根本不会考虑默认构造函数,那么它被声明为delete
and private
没关系。
顺便说一句:对于DefaultPrivate x;
默认初始化 http://en.cppreference.com/w/cpp/language/default_initialization被执行,
if T
is a non-POD (until C++11)
类类型,会考虑构造函数并针对空参数列表进行重载解析。调用所选的构造函数(默认构造函数之一)来为新对象提供初始值;
所以尝试使用默认构造函数,但它是delete
ed 然后编译失败。
如果您使用聚合初始化,例如DefaultPrivate x{};
,代码也可以正常工作;和n_
将值已初始化 http://en.cppreference.com/w/cpp/language/value_initialization(进而零初始化 http://en.cppreference.com/w/cpp/language/zero_initialization) as 0
.
LIVE https://wandbox.org/permlink/IYdoChD5QIatuUZ1