C++11扩大了列表初始化的适用范围,使其可以用于所有内置类型和用户定义的类型(即类对象)。

1、当列表初始化用于内置类型的变量时,这种初始化形式有一个重要的特点:如果我们使用列表初始化且初始化值存在丢失信息的风险,则编译器将报错。也就是说在使用列表初始化时编译器将禁止将变量类型进行缩窄转换,即不能将宽的变量类型通过列表初始化的形式初始化给窄的变量。例子如下:

#include <iostream>

using namespace std;

int main()
{
  int i = 3;
  double d = 3.14;

  char c1{ i };//int转化成int
  short a{ i };//int转化成short

  char c2{ d };//double转化成char
  short c3{ d };//double转化成short
  float f{ d };//double转化成float

  system("pause");
  return 0;
}
在VS2015中编译结果如下:

在g++中编译结果如下:

从上面可以看出,在VS中会报错,而在g++中只是给出警告。

2、对于列表初始化内置类型的变量,编译器虽然禁止将变量类型进行缩窄转换。但是对于字面值常量,如果在较窄类型的取值范围内,部分类型的字面值常量可以用来列表初始化较窄的类型。例子如下:

#include <iostream>

using namespace std;

int main()
{
  //66是int类型的,因为对于十进制的字面值默认是带符号数,
  //其类型是int、long、long long中尺寸最小的那个
  //66.6是double类型,因为默认浮点型字面值是一个double
  char c1{ 66 }; //int转化成char
  short s{ 66 }; //int转化成short

  char c2{ 66.6 }; //double转化成char
  int i{ 66.6 }; //double转化成int
  float f{ 66.6 };//double转化成float

  //扩展
  double d1{ 66 }; //int转化成double
  double d2{'c'};//char转化成double
  double d3{66.6f};//float转化成double

  system("pause");
  return 0;
}
在VS2015中编译结果如下:

从上面结果可知:对于浮点型字面常量不允许列表初始化更窄的类型变量,即使都是浮点型;而对于整型字面值常量可以列表初始化更窄的类型变量。对于整型字面值常量、字符型字面值常量可以列表初始化diuble型变量,在3中我们将看到用int型变量不能列表初始化double类型变量。对于float型字面值常量可以列表初始化double型变量,这和3中一致。

3、在《C++ primer plus》中P796页中:列表初始化允许转换为更宽的类型。但实验中发现列表初始化并不是允许所有的窄类型转化成宽类型变量。例子如下:

#include <iostream>

using namespace std;

int main()
{
  char c = 'c';
  short s = 3;
  int i = 3;
  float f = 3.14f;

  int i1{ s };//short转换成int
  int i2{ c };//char转换成int
  double d1{ c };//char转换成double
  double d2{ s };//short转换成double
  double d3{ i }; //int转换成double

  double d4{ f };//float转换成double
  int64_t it{ f };//float转换成int64_t(8byte)

  system("pause");
  return 0;
}
在VS2015中编译结果如下:

从结果可以看出使用列表初始化时,只允许窄整型向宽整型、窄浮点型向更宽的浮点型转换。窄整型不能向更宽的浮点型转换,窄浮点型也不能向更宽的整型转换。

4、总结

总结以上,可以得出结论如下:

在使用列表初始化初始内置类型的变量时:

1)使用了列表初始化,将禁止将任何内置类型的变量进行缩窄转换。

2)对于使用字面值常量列表初始化内置类型的变量时,对于整型字面值常量可以缩窄成整型变量类型。浮点型字面值量

不能缩窄成整型变量类型和浮点变量类型。

3)使用列表初始化内置类型变量时,只允许窄整型变量向宽整型变量、窄浮点型变量向更宽的浮点型变量转换。窄整型变

量不能向更宽的浮点型变量转换,窄浮点型变量也不能向更宽的整型变量转换。但是对于字面值常量,窄整型的字面值

常量可以向宽整型的浮点型变量转换。

====》》》对于字面值常量的类型,可以参考《C++ primer》P35页

====》》》对于列表初始化,可以参考《C++ primer》P39页和《C++ primer plus》P796页
---------------------
作者:flychildc
来源:CSDN
原文:https://blog.csdn.net/J_H_C/article/details/83579131
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. js点击a链接弹出alert对话框
  2. IntelliJ IDEA + Maven创建Java Web项目
  3. Delphi与C语言类型转换对照
  4. java中的构造函数
  5. 【tarjan】BZOJ 1051:受欢迎的牛
  6. ios nslog 打印字典为中文
  7. 【转】 Android用于提示等待的ProgressDialog
  8. linux 下 openssl 编译和交叉编译
  9. loading.io一个loading图标网站,跟大家分享
  10. [js高手之路]Node.js模板引擎教程-jade速学与实战3-mixin
  11. 【转】FIO使用指南
  12. 《algorithms Unlocked》读书笔记3——计数排序
  13. Scala:数据类型和变量
  14. windows下安装mysql驱动mysql-python
  15. 真机测试没有问题,but上线后安装在手机上crash。也有无法打包的情况。
  16. Qt ------ excel 操作
  17. Quartz的基本使用之入门(2.3.0版本)
  18. ref和引用类型传参的区别
  19. dp乱写3:环形区间dp(数字游戏)
  20. Python 创建字典的多种方式

热门文章

  1. 在linq语言中,不能准确按拼音排序(转)
  2. java笔记之IO2写操作
  3. Mysql数据库基础操作
  4. Gym 100548F Color (数论容斥原理+组合数)
  5. php pdo操作数据库
  6. SpringMVC分页查询无法直接将对象转换成json的解决办法(报org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type:错)
  7. 数据结构 - 顺序栈的实行(C语言)
  8. 数据结构 - 动态单链表的实行(C语言)
  9. Median Value
  10. 转】Nodejs对MongoDB模糊查询