六一的部落格


关关难过关关过,前路漫漫亦灿灿。



使用赋值运算符: 根据右侧表达式推断变量类型

变量类型由两部分共同决定:

  1. 右侧表达式结果的具体类型
  2. 左侧使用的声明符

    如const限定符, 类型修饰符: * , & , 和 &&
1auto v = expr;

使用auto定义多个变量时, 这些变量的基本类型必须一致


使用表达式结果的具体类型和值

  1. 表达式结果为对象
    1int a = 5, &r = a;
    2auto b = r; // 表达式结果为对象, b的类型和值与该对象一致
    
  2. 表达式结果为值
    1auto a = 5; // 表达式结果为值, a的类型为int, 值为5
    

忽略顶层const, 保留底层const

  1. 如果表达式结果为具有顶层const的对象, 忽略顶层const

    表达式结果为对象

    1const int ci = 4;
    2auto i = ci;  // i的类型是int
    
  2. 如果表达式结果为具有底层const的指针, 保留底层const

    1const int ci = 4, *p = &ci;
    2auto p2 = p;   // p2的类型为const int *
    3auto p3 = &ci; // p3具有底层const
    

使用auto定义具有顶层const的对象

左侧使用 const 限定符

1const auto ci = 3; // ci的类型是const int

使用auto定义指针

此时, 赋值运算符右侧的表达式结果的具体类型为指针

  1. 表达式结果的具体类型为指针

    1int a = 5, *p = &a;
    2auto p2 = p;         // p2是指针
    3auto p3 = &a;        // 取地址运算符返回一个指针值, p3是指针
    
  2. 左侧使用类型修饰符 * , 要求右侧表达式结果的具体类型为指针

    1int a = 5, *p2 = &a;
    2auto *p4 = p2;       // p4是指针
    

取地址符的运算对象具有顶层const, 则指针具有底层const

1const int ci = 4;
2auto p = &ci;          // p类型为const int *

表达式结果为具有底层const的指针对象, 则左侧指针亦具有底层const

1const int ci = 4, *cp = ci;
2auto cp2 = cp;

使用auto定义左值引用

  1. 左侧使用类型修饰符 & , 要求右侧表达式为左值
  2. 如果右侧表达式是左值, 左侧使用类型修饰符 && 也将得到一个左值引用
1int a = 5, &r = a;
2auto &r2 = a;    // r2的类型是int &
3auto &&r3 = b;   // r3的类型是int &

如果表达式结果为具有顶层const的对象, 左值引用具有底层const

1const int ci = 4;
2auto &cr = ci;        // cr的类型是const int &
3const auto &cr2 = ci; // cr2的类型是const int &

使用auto定义右值引用

使用类型修饰符 && ,要求右侧表达式是右值


类型说明符auto


使用赋值运算符: 根据右侧表达式推断变量类型

变量类型由两部分共同决定:

  1. 右侧表达式结果的具体类型
  2. 左侧使用的声明符

    如const限定符, 类型修饰符: * , & , 和 &&
1auto v = expr;

使用auto定义多个变量时, 这些变量的基本类型必须一致


使用表达式结果的具体类型和值

  1. 表达式结果为对象
    1int a = 5, &r = a;
    2auto b = r; // 表达式结果为对象, b的类型和值与该对象一致
    
  2. 表达式结果为值
    1auto a = 5; // 表达式结果为值, a的类型为int, 值为5
    

忽略顶层const, 保留底层const

  1. 如果表达式结果为具有顶层const的对象, 忽略顶层const

    表达式结果为对象

    1const int ci = 4;
    2auto i = ci;  // i的类型是int
    
  2. 如果表达式结果为具有底层const的指针, 保留底层const

    1const int ci = 4, *p = &ci;
    2auto p2 = p;   // p2的类型为const int *
    3auto p3 = &ci; // p3具有底层const
    

使用auto定义具有顶层const的对象

左侧使用 const 限定符

1const auto ci = 3; // ci的类型是const int

使用auto定义指针

此时, 赋值运算符右侧的表达式结果的具体类型为指针

  1. 表达式结果的具体类型为指针

    1int a = 5, *p = &a;
    2auto p2 = p;         // p2是指针
    3auto p3 = &a;        // 取地址运算符返回一个指针值, p3是指针
    
  2. 左侧使用类型修饰符 * , 要求右侧表达式结果的具体类型为指针

    1int a = 5, *p2 = &a;
    2auto *p4 = p2;       // p4是指针
    

取地址符的运算对象具有顶层const, 则指针具有底层const

1const int ci = 4;
2auto p = &ci;          // p类型为const int *

表达式结果为具有底层const的指针对象, 则左侧指针亦具有底层const

1const int ci = 4, *cp = ci;
2auto cp2 = cp;

使用auto定义左值引用

  1. 左侧使用类型修饰符 & , 要求右侧表达式为左值
  2. 如果右侧表达式是左值, 左侧使用类型修饰符 && 也将得到一个左值引用
1int a = 5, &r = a;
2auto &r2 = a;    // r2的类型是int &
3auto &&r3 = b;   // r3的类型是int &

如果表达式结果为具有顶层const的对象, 左值引用具有底层const

1const int ci = 4;
2auto &cr = ci;        // cr的类型是const int &
3const auto &cr2 = ci; // cr2的类型是const int &

使用auto定义右值引用

使用类型修饰符 && ,要求右侧表达式是右值