【C++】CppCon 2018: Nicolai Josuttis “The Nightmare of Initialization in C++” -知识点目录

CppCon 2018: Nicolai Josuttis “The Nightmare of Initialization in C++”

1. Initializing without all

2. Other problems

  1. auto退化介绍 - [25:32]

3. What we learned

使用{}来表示类的实例化,来跟()表示函数调用区分开来

在这里插入图片描述

Solving the “Most Vexing Parse” Problem - [32:15]

在这里插入图片描述

4. {...} disables implicit narrowing

E.g., converting floating-point to integral values or unsigned to signed
在这里插入图片描述

5. {...} can be used as initializer list

5.1 使用{}初始化的函数重载

  1. 列表异质时表示多个不同类型形参
  2. 列表同质时表示 std::initializer_list<>

5.2 Std::initializer_list<>作为形参类型时,可以接收空列表obj{};,但不会接收空实参obj;

在这里插入图片描述

5.3 {}初始化重载示例:在构造函数重载时,无实参列表初始化会调用默认构造函数

在这里插入图片描述
这里根据“经验”来看的话,由于P(int = 0)更加narrow,从“偏序”的角度看,感觉应该会优先选择P(int = 0)但是,奇怪的是P e { 77 }调用的是 initializer_list重载——P::P(initializer_list)
但实际上,最终使用的是P(int = 0)默认初始化

  1. 首先,根据d的调用形式——P d {};,确定为列表初始化(1)
  2. 根据列表初始化的效果,由于P不是Aggregate,(因为它有两个用户定义的构造函数),且P拥有默认构造函数,那么进行值初始化;
  3. 根据值初始化的效果,P拥有非平凡默认构造函数P(int = 0),于是对d进行默认初始化
  4. 根据默认初始化的效果,对P的所有构造函数进行决议,且限定参数列表为空,(而不是拥有0个元素的 initializer-list),于是编译器会选择P(int = 0)的默认构造函数;

Note
视频中 Nicolai Josuttis 给出的判断准则是:
在这里插入图片描述
使用这个准则,跟使用重载规则获得的结论是一致的。

6. Collection

Keyword explicit

explicit只会影响复制初始化 - [42:47]

7. Aggregates

示例:空初始化器列表复制初始化元素

在这里插入图片描述
这里v{}使用的是空初始化器列表复制初始化,相关说明请参考Cppreference

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值