php网站搬家教程,祥云网站优化,电商运营面试问题及回答,wordpress添加导航菜单系列文章目录
C1114新标准——Variadic templates#xff08;数量不定的模板参数#xff09; C1114新标准——Uniform Initialization#xff08;统一初始化#xff09;、Initializer_list#xff08;初始化列表#xff09; 文章目录 系列文章目录1. 定义2. I…系列文章目录
C1114新标准——Variadic templates数量不定的模板参数 C1114新标准——Uniform Initialization统一初始化、Initializer_list初始化列表 文章目录 系列文章目录1. 定义2. Initializer_list初始化列表禁止窄化转换Initializer_list在标准库中的应用 1. 定义 在C11之前有多种初始化方式包括以下几种
1.int x1 5;
2.int x1(5);
3.int x1{5};
4.int x1 {5};其中1、2为传统初始化语法3、4为列表初始化不仅是基本数据类型可以这样初始化stl容器、自定义类和模板类都可以使用这些方法初始化。C11之后更推荐统一使用列表初始化。 统一初始化的用法是用大括号{ }来进行初始化
int values[]{1,2,3};vectorint v{1,2,3};vectorint v({1,2,3});//这不是统一初始化而是构造函数接受一个Initializer_list的初始化。
vectorint v{1,2,3};//这不是统一初始化而是赋值初始化。
vectorstring n{1,2,3};complexdouble c{3.0,4.0};2. Initializer_list初始化列表 用于构造的大括号其实是一个Initializer_list初始化列表其内部包含一个指向array头部的指针和array的长度所以当使用Initializer list进行拷贝构造时所指向的是同一个array。array是对数组进行改造而成的新容器使其符合STL规范。 一个类可以有两种初始化直接接受参数初始化或者接受一个Initializer list进行初始化。
P p(7,5); // 输出P(int,int),a7,b5
P q{7,5}; // 输出P(Initializer_listint), values 7 5
P r{7,5,3}; // 输出P(Initializer_listint), values 7 5 3
P s{7,5}; // 输出P(Initializer_listint), values 7 5如果只定义了第一种初始化方式而没有第二种初始化方式q和s仍然可以编译通过因为编译器会将初始化列表进行拆解然后调用第一种初始化方式。但r将无法编译通过因为编译器将其列表拆解后与第一种初始化方式的参数数量不符合无法调用所以会报错。 如果只定义了第二种初始化方式而没有第一种初始化方式则p无法初始化。因为虽然编译器会将初始化列表拆解为一个个的参数但却不能将一个个的参数合并为一个初始化列表这不是一个双向的过程
禁止窄化转换 在传统的初始化类型当中允许高精度的数据类型给低精度的数据类型进行赋值从而实现窄化转换。但统一初始化将不再允许窄化转换。
int a 3.14; // 正确。a 3;int a{3.14}; // 错误统一初始化不可以窄化转换Initializer_list在标准库中的应用
C11之后标准库的容器也可以使用Initializer_list进行操作