C++11之防止类型收窄(列表初始化)

Posted 林夕07

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11之防止类型收窄(列表初始化)相关的知识,希望对你有一定的参考价值。

系列文章

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之Lanbda表达式(匿名函数)

C++11之右值引用:移动语义和完美转发(带你了解移动构造函数、纯右值、将亡值、右值引用、std::move、forward等新概念)

C++11之继承构造函数(using 声明)

C++11之委派构造函数

C++11之显式转换操作符-explicit

C++11之初始化列表


文章目录


类型收窄

类型收窄:是指数据发生变化、精度丢失这种隐式类型转换的情况。
列表初始化的一个重要功能就是可以防止类型收窄narrowing)。

导致类型收窄的场景

  1. 从浮点类型隐式转换为整型数。例如 int num = 3.14; 将一个浮点型数字给到int类型变量时会进行小数截断
  2. 从高精度的浮点型转换为低精度的浮点型数据。例如 double d = 3.14159566; float f = d; 将一个double类型的变量赋给一个float的、将long double类型的变量赋给一个double类型的变量都会造成类型收窄。
  3. 从整型(非枚举类的枚举类型)转换为浮点型。整数值过大导致浮点型存不下来也会导致类型收窄。
  4. 从整型(非枚举类的枚举类型)转换为低长度的整型。这种情况类型第二条,例如long long 转换为 int

代码演示

在下面这段代码中,通过赋值表达式或者小括号的表达式进行初始化时,就算是类型收窄也不会报错只会有警告⚠。但是如果采用初始化列表的方式出现类型收窄时就会导致编译出错。

#include <iostream>

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中引入了列表初始化,列表初始化可以有效的防止类型收窄。一般来说数据的改变将大概率会导致程序出错,这有效的阻止了一些隐患,这也是列表初始化有别于其他初始化方式。

以上是关于C++11之防止类型收窄(列表初始化)的主要内容,如果未能解决你的问题,请参考以下文章

第8课 列表初始化_防止类型收窄explicit关键字

类型收窄 error C2397: conversion from ‘const int‘ to ‘char‘ requires a narrowing conversion

C++11新特性精讲(多线程除外)

C++11新特性精讲(多线程除外)

C++11之初始化列表

C++11——初始化列表,变量类型推到,默认成员函数控制