C++11 列表初始化(list_initialization)
一 列表初始化
定义:从花括号初始化器列表初始化对象。
语法:
// 直接列表初始化
T object { arg1, arg2, ... }; (1)
T { arg1, arg2, ... } (2)
new T { arg1, arg2, ... } (3)
Class { T member { arg1, arg2, ... }; }; (4)
Class::Class() : member{arg1, arg2, ...} {... (5)// 复制列表初始化
T object = {arg1, arg2, ...}; (6)
function( { arg1, arg2, ... } ) (7)
return { arg1, arg2, ... } ; (8)
object[ { arg1, arg2, ... } ] (9)
object = { arg1, arg2, ... } (10)
U( { arg1, arg2, ... } ) (11)
Class { T member = { arg1, arg2, ... }; }; (12)
二 窄化转换
列表初始化通过禁止下列转换,对隐式转换加以限制:
从浮点类型到整数类型的转换;
从 long double 到 double 或 float 的转换,以及从 double 到 float 的转换,除非源是常量表达式且不发生溢出;
从整数类型到浮点类型的转换,除非源是其值能完全存储于目标类型的常量表达式;
从整数或无作用域枚举类型到不能表示原类型所有值的整数类型的转换,除非源是其值能完全存储于目标类型的常量表达式;
举例:
{// 窄化转换long double a = 1.1;// int b{ a };// std::cout << b << std::endl;}
三 聚合类型
C++14起
聚合体直接从同类型的单元素花括号初始化器列表进行复制/移动初始化,但非聚合体首先考虑 initializer_list 构造函数。
聚合体类型要求如下:
数组类型;
符合以下条件的类类型(典型的为 struct 或 union):
无私有或受保护非静态数据成员;
无用户声明的构造函数 (C++11 前);
无用户提供的构造函数(允许显式预置或弃置的构造函数)(C++11 起)(C++17 前);
无用户提供、继承或 explicit 构造函数(允许显式预置或弃置的构造函数)(C++17 起)(C++20 前);
无用户声明或继承的构造函数(C++20 起);
无虚、私有或受保护基类(C++17 起);
无虚成员函数;
无默认成员初始化器(C++11 起)(C++14 前) ;
举例:
struct Demo {int a_;int b_;Demo(std::initializer_list<int> list) {std::cout << "Demo(std::initializer_list<int> list)" << std::endl;}
};struct Demo1 {int a_;int b_;Demo1(int a, int b) {a_ = a;b_ = b;std::cout << "Demo1(int a, int b)" << std::endl;}
};struct Demo2 {int a_;int b_;Demo2(int a, int b) {a_ = a;b_ = b;std::cout << "Demo2(int a, int b)" << std::endl;}Demo2(std::initializer_list<int> list) {std::cout << "Demo2(std::initializer_list<int> list)" << std::endl;}
};...{// 非聚合体首先考虑 initializer_list 构造函数Demo d{ 1, 2 };Demo1 d1{ 1, 2 };Demo2 d2{ 1, 2 };}
...
四 参考
初始化列表
C++11 列表初始化(list_initialization)相关推荐
- C++11列表初始化
列表初始化: 1.旧语法中定义了初始化的几种不同形式,如下: int data = 0; //赋值初始化 int data = {0}; //花括号初始化 int data(0); //构造初始化 i ...
- C++11 就地初始化与列表初始化
文章目录 1.就地初始化 1.1 简介 1.2 就地初始化与初始化列表的先后顺序 2.列表初始化 参考文献 1.就地初始化 1.1 简介 在 C++11 之前,只能对结构体或类的静态常量成员就地初始化 ...
- 就地初始化与列表初始化
1.就地初始化 在 C++11 之前,只能对结构体或类的静态常量成员就地初始化,其他的不行. class C { private:static const int a=10; // yesint ...
- C++11之防止类型收窄(列表初始化)
系列文章 C++11之正则表达式(regex_match.regex_search.regex_replace) C++11之线程库(Thread.Mutex.atomic.lock_guard.同步 ...
- 【 C++11 】列表初始化、声明、范围for、STL中一些变化
目录 1.C++11简介 2.统一的列表初始化 { }初始化 initializer_list容器 3.声明 auto decltype nullptr 4.范围for 5.STL中一些变化 1.C+ ...
- C++11新特性之列表初始化、POD、聚合类
C++11之列表初始化 列表初始化格式 1.C++98/03中的列表初始化格式: int arr_int[3] = { 1, 2, 3 }; long arr_long[] = { 4, 5, 6 } ...
- [C++11新特性](24)列表初始化,右值引用,可变参数模板,lambda表达式,包装器
文章目录 列表初始化 {}初始化 initializer_list auto.nullptr.范围for decltype STL的变化 右值引用 简介 移动构造与移动赋值 完美转发 新的类功能 可变 ...
- C++列表初始化容器
initializer_list是一个模板类,可能你已经用过它了但不知道而已,比如下面的代码就用了 #include <iostream> #include <vector>i ...
- 变量之--列表初始化和结构化绑定
变量之(变长)列表初始化 关键词 std::initializer_list 解释 在 C++98/03 中的对象初始化方法有很多种,这无疑增大了学习难度.这中情况在C++11中终于得到解决. 先看看 ...
最新文章
- 自适应激活函数 ACON:统一ReLU和Swish的新范式
- shopeeLazada越南站点“热销品类”推荐
- 【NLP】向量检索模型落地:瓶颈及解法!
- docker --- 梳理 Dockerfile docker-compose.yml
- RE validation in Java EE
- MySQL - 视图
- macos通过brew安装后端开发工具
- 刘强东发新年信:过去一年我们异常艰难
- Ceph (2) - 安装Ceph集群方法 2:使用cephadm配置Nautilus版Ceph集群
- CVPR(IEEE Conference on Computer Vision and Pattern Recognition)
- Linux下通过ssh上传、下载文件或者文件夹
- Springboot拼接实体类里面的URL
- 第四章 Python数据预处理之划分训练集与测试集
- 基于python的论文摘要怎么写_Python实现文章摘要的提取方式
- Spring data jpa + sqlserver + druid, druid连接sqlserver 报错:查询超时值 -1 无效。
- 学生党高性价比蓝牙耳机有哪些?高性价比学生党蓝牙耳机推荐
- FAST-LIO公式推导
- 语音智能时代,我选择这个浪尖
- c0000005 Access Violation
- windows10无法连接到微软服务器,Win10右下角提示Windows无法连接到SENS服务怎么解决...