对象初始化的方式有很多种,特别是C++11新引入了统一初始化,可以用于一切场合的初始化,至少从概念上可以这么理解。目前常见的初始化方式大概有以下几种:
C++11新引入了统一初始化方式可以处理很多C++98无法完成的工作,例如:
(1)给一个STL容器初始化为持有特定集合:
(2)为类的非静态成员变量指定默认初始化值:
(3)为不可赋值的对象进行初始化,例如std::atomic型别对象,不支持等号运算符,可以使用()或者{}进行初始化:
(4)它将直接禁止窄化型别转换:
(5)对解析语法免疫
例如我们本来想以默认方式构造一个对象,但因为解析语法原因,导致变成了声明一个函数。例如:
在条款2时,我们就说过,如果使用auto来接收大括号初始化的变量,那么auto将被推导为std::initializer_list类型,所以使用大括号作为函数形参时,其类型是:std::initializer_list<T>。如果某个重载函数的形参为std::initializer_list<T>,则会匹配所有大括号的型别,具体会分以下几种情况进行处理:
1、std::initializer_list<T>类型完全匹配,则直接调用该重载函数
2、若实参需要提升,则先提升后匹配
3、若实参需要窄化才能匹配,则编译报错
3、如果实参完全不可能匹配到std::initializer_list<T>中的类型,则判断是否又满足该类型的其他重载函数