C++11之正则表达式(regex_match、regex_search、regex_replace)
C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)
C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管理
C++11之强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)
C++11之右值引用:移动语义和完美转发(带你了解移动构造函数、纯右值、将亡值、右值引用、std::move、forward等新概念)
类型收窄:是指数据发生变化、精度丢失这种隐式类型转换的情况。
列表初始化的一个重要功能就是可以防止类型收窄(narrowing
)。
int num = 3.14;
将一个浮点型数字给到int类型变量时会进行小数截断
。double d = 3.14159566; float f = d;
将一个double
类型的变量赋给一个float
的、将long double
类型的变量赋给一个double
类型的变量都会造成类型收窄。long long
转换为 int
。在下面这段代码中,通过赋值表达式或者小括号的表达式进行初始化时,就算是类型收窄也不会报错只会有警告⚠。但是如果采用初始化列表的方式出现类型收窄时就会导致编译出错。
#include
using namespace std;
/*
* 数据变化、精度丢失 都是类型收窄
*/
int main()
{
const int x = 1024;
const int y = 10;
char a = x; // 类型收窄
char* b = new char(1024); // 类型收窄
char c = { x }; // 类型收窄 报错
char d = { y };
unsigned char e = { -1 }; // 类型收窄 报错
float f{ 7 };
int g{ 2.0f }; // 类型收窄 报错
float* h = new float{ 1e48 }; // 类型收窄 报错
float i = 1.21;
return 0;
}
在C++11中引入了列表初始化,列表初始化可以有效的防止类型收窄。一般来说数据的改变将大概率会导致程序出错,这有效的阻止了一些隐患,这也是列表初始化有别于其他初始化方式。