文章目錄
  1. 1. auto类型推导
    1. 1.1. auto的概念
    2. 1.2. auto的推导规则:
    3. 1.3. auto的限制:
  2. 2. decltype关键字
    1. 2.1. decltype的概念
    2. 2.2. decltype推导规则
  3. 3. 返回类型后置语法—auto和decltype的结合使用
  4. 4. 模板别名
    1. 4.1. 模板别名的概念
    2. 4.2. 函数模板的默认模板参数


作者:Frank
时间:2016-11-25

auto类型推导

auto的概念

  1. auto并不能代表一个实际的类型声明,只是一个类型声明的占位符;
  2. 使用auto声明的变量必须马上初始化,以让编译器推断出它的实际类型,并在编译时将auto占位符替换为真正的类型。

auto的推导规则:

  1. 当不声明为指针或引用时,auto的推导结果和初始化表达式抛弃引用和cv限定符后类型一致;
  2. 当声明为指针或引用时,auto的推导结果将保持初始化表达式的cv属性;

注:cv属性表示const/volitate等限定符;

auto的限制:

  1. auto不能用于函数参数;
  2. auto不能用于类中的非静态成员变量;
  3. auto无法定义数组;
  4. auto无法推导出模板参数;

decltype关键字

decltype的概念

auto所修饰的变量必须要立即初始化,若仅希望得到类型,而不需要定义变量的时候,可以使用decltype,它是用来在编译时推导表达式类型。如下:decltype(exp)。其中,exp表示一个表达式。decltype将精确的推导出表达式定义本身的类型,不会像auto那样在某些情况下舍弃掉引用和cv限定符。

decltype推导规则

  1. exp是标识符、类访问表达式,decltype(exp)和exp的类型一致;
  2. exp是函数调用,decltype(exp)和返回值的类型一致;
  3. 其他情况,若exp是一个左值,则decltype(exp)是exp类型的左值引用,否则和exp类型一致;

注:对于纯右值而言,只有类类型可以携带cv限定符,此外一般忽略掉cv限定。

返回类型后置语法—auto和decltype的结合使用

在C++11中增加了返回类型后置语法,将decltype和auto结合起来完成返回值类型的推导。见示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//ex1
template<typename T,typename U>
auto add(T t,U u) -> decltype(t+u){
return t+u;
}

//ex2
int& foo(int& i);
float foo(float& f);

template<typename T>
auto func(T& val)->decltype(foo(val)){
return foo(val);
}

模板别名

模板别名的概念

在C++11中,重定义了using来作为模板别名的定义语法。实际上,using的别名语法覆盖了typedef的全部功能。示例如下:

1
2
3
4
5
6
7
//重定义unsigned int
typedef unsigned int uint_t;
using uint_t=unsigned int;

//重定义std::map
typedef std::map<std::string,int> map_int_t;
using map_int_t=std::map<std::string,int>;

通过using定义模板别名的语法,只是在普通类型别名语法的基础上增加了template的参数列表。使用using可以轻松的创建一个新的模板别名,而不需要像之前的C++一样使用繁琐的外敷模板。

函数模板的默认模板参数

在C++98/03中,类模板可以有默认的模板参数,但是却不支持函数的默认模板参数,而在C++11中该限制被解除了。当所有的模板参数都有默认参数时,函数模板的调用可以如同一个普通函数,而对于类模板而言,哪怕所有参数都有默认参数,在使用时也必须在模板名后跟随”<>”来实例化。
同时,函数模板的默认模板参数在使用规则上和其他的默认参数也有不同,它没有必须写在参数表最后的限制。



转载请注明出处

文章目錄
  1. 1. auto类型推导
    1. 1.1. auto的概念
    2. 1.2. auto的推导规则:
    3. 1.3. auto的限制:
  2. 2. decltype关键字
    1. 2.1. decltype的概念
    2. 2.2. decltype推导规则
  3. 3. 返回类型后置语法—auto和decltype的结合使用
  4. 4. 模板别名
    1. 4.1. 模板别名的概念
    2. 4.2. 函数模板的默认模板参数