类型别名

  • 类型别名是一个等价于某种类型的名字
    • 定义方式有传统的typedef别名声明(using) 两种
    • 定义的别名等价于对应类型(包括复合类型)
    1
    2
    3
    4
    typedef double dub;    //dub是double的别名
    using unint = unsigned int; //unint是unsigned int的别名
    using pdub = double*; //pdub是double*别名
    pdub ptr = nullptr; //等价于double* ptr = nullptr;

auto类型说明符

  • auto会告诉编译器去分析表达式所属类型并赋予变量
    • 用于定义时必须有初始值
    • 声明多个变量时初始基本数据类型必须一致
    • auto通常会忽略顶层const,保留底层const
    1
    2
    3
    4
    5
    6
    auto var = 42, *pvar = &var;
    const int i = 42;
    auto a = i; //a是一个整数
    const auto b = i; //b为int常量
    //对常量获取地址是一种底层const
    auto c = &i; //c是一个指向int常量的指针

decltype类型指示符

  • decltype用于选择并返回操作数的数据类型
    • 编译器会分析表达式并返回它的类型,但不计算实际的值
      • 如果表达式能做为左值,则返回引用类型
      • 变量的类型会如实返回(包括引用和顶层const)
        • 给变量名加上括号会让其被识别为表达式,这会返回引用类型
    1
    2
    3
    4
    decltype (ft()) var = x;    //var的类型为函数ft()的返回值
    const int a = 42, &r = a;
    decltype (a) b = a; //b的类型为const int
    decltype (r) c = b; //c的类型为const int&

易错

  • using pint = int*的含义是pintint*类型的别名,在使用它进行声明时const pint ptr = nullptr的含义是一个指向int类型的常量指针,而非const int *ptr = nullptr一个指向int常量的指针