C++CppCon 2018: Nicolai Josuttis “The Nightmare of Initialization in C++” -知识点目录
Posted songyuc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
- 举例说明RVO - [20:47]
2. Other problems
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 使用
初始化的函数重载
- 列表异质时表示多个不同类型形参
- 列表同质时表示 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)
的默认初始化:
- 首先,根据
d
的调用形式——P d ;
,确定为列表初始化(1) ; - 根据列表初始化的效果,由于P不是Aggregate,(因为它有两个用户定义的构造函数),且P拥有默认构造函数,那么进行值初始化;
- 根据值初始化的效果,P拥有非平凡默认构造函数
P(int = 0)
,于是对d
进行默认初始化; - 根据默认初始化的效果,对
P
的所有构造函数进行决议,且限定参数列表为空,(而不是拥有0个元素的 initializer-list),于是编译器会选择P(int = 0)
的默认构造函数;
Note
视频中 Nicolai Josuttis 给出的判断准则是:
使用这个准则,跟使用重载规则获得的结论是一致的。
以上是关于C++CppCon 2018: Nicolai Josuttis “The Nightmare of Initialization in C++” -知识点目录的主要内容,如果未能解决你的问题,请参考以下文章
C++Calling Functions: A Tutorial - Klaus Iglberger - CppCon 2020 - 知识点目录
C++Calling Functions: A Tutorial - Klaus Iglberger - CppCon 2020 - 知识点目录
C++Calling Functions: A Tutorial - Klaus Iglberger - CppCon 2020 - 知识点目录
C++Breaking Dependencies: The SOLID Principles - Klaus Iglberger - CppCon 2020 -知识点目录
C++Breaking Dependencies: The SOLID Principles - Klaus Iglberger - CppCon 2020 -知识点目录
C++CppCon 2014: Scott Meyers “Type Deduction and Why You Care“ - 知识点目录