c++ - 列表初始化 - C++14 中发生了什么变化?
问题描述
这两行来自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
仅在 C++14 中,聚合可以有默认的成员初始化器;当然,这不会导致两种语言版本之间的行为差异,但是无论如何它在这两个规则之间的行为并没有不同(因为它只替换了常见的默认初始化)。
推荐阅读
- regex - 以下文本的正则表达式
- javascript - 如何从存储在 json 对象中的数组中删除元素?| 角js | 范围
- php - 当“all_participant”为“0”时,数据库的结构是否正确以处理场景?
- java - 当子项目之间存在冲突时,为什么maven使用旧版本?
- angular - 最安全的界面转换方式
- php - Apache 2.4:php_network_getaddresses:getaddrinfo 失败:- 没有进行 DNS 查找
- ruby - 这种语法叫什么?{ |n| “用户#{n}”}
- javascript - 用日期填充输入框
- python - 在 Windows 上安装 python 库的问题:CondaHTTPError: HTTP 000 CONNECTION FAILED for url
我想安装 pymongo 库,但出现以下错误:
(C:\Users\xxxxxxx\AppData\Local\Continuum\anaconda3) C:\Us
- featuretools - 如何使用功能工具 get_pandas_data_slice