类型收窄:
这是因为在列表初始化时出现了类型收窄,抛出的异常。
类型收窄:是指数据发生变化、精度丢失这种隐式类型转换的情况。
列表初始化的一个重要功能就是可以防止类型收窄(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; }
错误展示
解决方案
如果这不是本意而为那么就需要仔细检查类型收窄会不会出现意想不到的错误,若坚持这么使用的话就需要使用强制类型转换例如static_cast
,或者采用默认的赋值方式。
C++常见错误
fatal error C1189: #error: STL1003: Unexpected compiler, expected C++ compiler
error C2041: illegal digit ‘9‘ for base ‘8‘ | error C2059: syntax error: ‘bad suffix on number‘
Error:QSqlDatabase: QMYSQL driver not loaded (Qt+C++ 找不到mysql的驱动)
Qt5Error:msvc-version.conf loaded but QMAKE_MSC_VER ins‘t set
Error:E0415 no suitable constructor exists to convert from “int“ to “Rational“
Error:E0415 no suitable constructor exists to convert from “int“ to “Rational“