类型转换分为隐式转换和显示转换。
几种隐式转换
算术转换:运算对象将转换成最宽的类型(避免损失精度)
整型提升:小整型(char(u)、short(u)、bool)会提升为int或unsigned int
较大的char类型会转换成int(u)、long(u)、long long(u)中最小的(能容纳char)
有符号与无符号数的转换:
无符号类型不小于有符号类型时,有符号类型转换成无符号类型。
无符号类型小于有符号类型时,转换结果依赖于机器。(?)
如果无符号类型的所有值都能存在该带符号类型中,则无符号类型的运算对象转换成带符号类型;
如果无符号类型的所有值不能存在该带符号类型中,则带符号类型的运算对象转换成无符号类型。
数组转换成指针:
数组名字通常自动转换成指向首元素的指针
decltype、取地址符、sizeof、typeid和用一个引用来初始化数组时,上述转换不会发生
指针的转换:
常量整数值0和字面值nullptr能转换成任意指针类型。
指向任意非常量的指针能转换成void*
指向任意对象的指针能转换成const void*
转换成布尔类型:非0为true,0为false(算术类型或指针类型)
转换成常量:
允许将指向非常量类型的指针(引用)转换成相应的常量类型的指针(引用)
类类型定义的转换:编译器每次只能执行一种类类型的转换。
几种显示转换:cast-name<type>(expression),如果type是引用,则结果是左值。(这里还没有弄明白……)
static_cast
const_cast
reinterpret_cast