类型与声明
初始化
Type X {value}; // 列表初始化Type X = {value};Type X = value;Type X(value);
- 以上4中初始化方式,只有第一种在任何场景下均可使用,可有效防止
窄化转换- 如果一种整型放不下另一种整型的值,则后者不会被转化为前者(如int转化为char)
- 如果一种浮点型放不下另一种浮点型,则后者不会转化为前者(如float到double)
- 浮点型不能转化为整型
- 整型值不能转化为浮点型
- 当使用auto关键字时,没必要使用列表初始化
- 当使用空初始化列表{}时,将使用默认值对变量进行初始化
- 如果没有指定初始化器
- 静态对象将使用相应数据类型的列表{}初始化
- 局部对象和自由存储的对象除非定义了默认构造函数,否则将不执行默认初始化
auto与{}
- 当我们初始化某个对象时,提到类型时,必须考虑两个部分:对象本身的类型和初始化器的类型
- 当使用auto关键字时,=是比{}更合适的选项
auto x1 {1}; // int的列表,包含一个元素
当存在一个合适的初始化器时,应该推断类型可以使用auto;当需要推断类型又没有合适的初始化器时,使用decltype(expr)修饰符
template<class T, class U>auto operator+(const Matrix<T>& a, const Matrix<U>& b)->Matrix<decltype(T{} + U{})>;// 通过后置类型语法推断函数的返回类型template<class T, class U>auto operator+(const Matrix<T>& a, const Matrix<U>& b)->Matrix<decltype(T{} + U{})>{Matrix<decltype(T{} + U{})> res;for (int i = 0; i != a.rows(); ++i)for (int j = 0; j != a.cols(); ++j)res(i, j) += a(i, j) + b(i, j);return res;}
