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

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 给出的判断准则是:

使用这个准则,跟使用重载规则获得的结论是一致的。

以上是关于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“ - 知识点目录