C++ type operation

类型操作

别名typedefusing

1
2
typdef dobuel wages;    //类型别名
using SI = Sales_imte; //别名声明

指针,常量和类型别名

1
2
3
typedef char *pstring;
const pstring cstr = 0; //基本数据类型是char *,即指针类型
const pstring *p;

不能简单的把pstringchar *替换,如果替换了变成下式:

1
const char *cstr = 0;   //基本数据类型是const char,

很容易把*看成是声明符的一部分,即*cstr的一部分,但是实际上*是和const char在一起的。const char *cstr指向char常量的指针,而const pstring cstr是指向char常量指针

auto关键字

编译器自动分析表达式的类型,auto定义的变量必须有初值。
使用一条auto语句可以声明多个变量,多个变量的基本数据类型必须一样。

1
2
auto i= 0, *p = &i; //正确
auto i = 1, d = 3.14; //错误

复合类型,常量和auto

  1. 编译器使用auto推断出来的值和初始值类型有时候不完全一样。比如使用引用其实使用的是引用对象的值。
  2. auto会忽略顶层const,保留底层const。如果希望auto推断出的是顶层const,需要显式的加一个const,即const auto = ...
  3. 将引用的类型设为auto也可以保留初始值中的顶层const属性,
  4. 如果给初始值绑定一个引用,并且设为auto类型,这个对象就不是顶层const了。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int i = 0, &r = i;
    auto a = r; // a是一个int,而不是int &

    const int ci = i, &cr = ci;
    auto b = ci; //b是一个int
    auto c = cr; //c是一个int, cr是ci别名,ci是顶层const
    auto d = &i; //d是int *
    auto e = &ci; //e是一个指向const的指针。

    const auto f = ci; //f是const int
    auto &g = ci; // g是int &

    const auto &j = 43;//这个j就不是顶层const了,类型是const int &,它是底层const。

decltype类型

decltypeauto的区别:

  1. 它只返回表达式的类型。
  2. 它能识别顶层const和引用类型
    1
    2
    3
    4
    5
    6
    7
    8
    int i = 0, &ri = i, *pi = &i;
    decltype(ri); //是int &
    decltype(ri+0); //是int
    const int ci = 0, &cj = ci;
    decltype(ci) p = 0; //const int,
    decltype(cj) q = 0; //const int &,顶层常量引用可以初始化成字面值
    decltype(ci) x; //错误,常量必须初始化
    decltype(cj) y; //错误,引用必须初始化

引用从来都是作为它所指对象的同义词出现,只有在decltype处是例外。

decltype和引用

  1. 如果表达式的内容是解引用操作,使用decltype将会得到引用类型。
  2. decltype((variable))的结果永远是引用,而decltype(variable)的结果只有在真的是引用的时候才会返回引用。
    1
    2
    3
    int i = 0;
    decltype((i)) d;
    decltype(i) e;

参考文献

1.《C++ Primer第五版》