effective modern C++笔记 第二章

1. auto类型推导与模板类型推导的相同点

template
void func(ParamType param);

func(expr);

Type x = expr;

Type类型在包含auto的时候,本质上Type和ParamType是一样一样的,而auto就对应着模板类型T。
由上一小节可以推断出:

//auto&在识别类型的时候,auto为等号右边对象的类型去掉&;
const int y = 1;
const int& z = y;
auto& x = y;        //x为const int&,auto为const int;
auto& x = z;        //x为const int&,auto为const int;

//auto&&在识别类型的时候,符合引用折叠类型
int y = 10;
auto&& x = y;      //x为int&, auto为int&;
auto&& x = 27;    //x为int&&, auto为int&&;

//same as  array,func

2. auto类型推导与模板类型推导的不同点

使用括号表达式来赋值的时候,auto推导与模板推导表现不同

  1. 赋值表达式的几种方式:
int x = 10;
int x(10);            //区分于函数声明,括号内为常量;
int x = {10};
int x{10};
  1. 不同点:
    使用括号赋值法(包含大括号和小括号)表现行为不同:模板类型参数无法识别括号赋值法;auto会识别类型为std::initializer_list
    auto能识别的要求也是括号内的变量类型是一致的。(毕竟std::initializer_list是一个模板类型)

  2. C++14的不同点
    C++14引用了auto可以作为普通函数的返回值,也可以作为lamdba表达式的函数形参,此时的auto类型推导是和模板类型推导完全一致的:无法识别括号表达式初始化

你可能感兴趣的:(effective modern C++笔记 第二章)