深入应用C++11学习笔记_1.1类型推导

1.1.1 auto类型推导

作用:编译期时通过表达式确定待定义的变量类型。

示例:

auto  x = 5;						
auto pi = new auto(1);		//pi 被推导为int*
const auto v = &x , u = 6;	//v是const int* , u是const int
static auto y = 0.0;				//y 是 double

特性:

  1. auto后的变量必须为同种类型,不能有二义性。
  2. 就算之前的变量有推导,之后的变量也必须推导或者赋值。
  3. 即使auto不声明为指针,也会自动推导出指针类型。
  4. 当表达式为引用类型时,会推导出原始类型。
  5. 当表达式带有const时,会转换为non-const。
  6. auto不能用于函数参数、非静态成员变量。
  7. auto无法定义数组。
  8. auto无法推导出模板参数。

适用场景:

  1. a冗长的STL迭代器定义。
  2. 泛型编程。
1.1.2 decltype关键字

作用:编译期时推导出一个表达式的类型。

示例:

int x = 0 ;
decltype(x) y = 1;			//y -> int;
decltype(x + y) z = 0 ;	//z -> int;

const int& i = x;
declytype(i) j = y;		//j -> const int &

const decltype(z) * p = &z; //p -> const int *
decltype(z) * pi = &z;			//pi -> int *
decltype(pi)* pp = & pi;		//pp -> int * *

特性:

  1. 可以保留表达式的引用和const限定。
  2. 当表达式时指针的时候可以推导出实际类型。

推导规则:

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

推导规则3示例:

int n = 0 , m = 0 ;
decltype(n + m) c = 0;		//c -> int
decltype(n += m) d = x;		//c -> int&

适用场景:

  1. 泛型编程。
  2. 通过变量表达式抽取变量类型。
1.1.3 返回类型后置语法——auto和decltype的结合使用

作用:泛型编程中通过参数的运算来得到返回值的类型。

原始的加法函数:

template <typename R, typename T, typename U>
R add(T t, U u)
{
    return t+u;
}
int a=1;
float b=2.0;
auto c = add<decltype(a + b)>(a, b);

这样使用相当不方便,因为外部不知道参数之间应该如何运算,只有函数内部才知道返回值应该用什么表达式进行推导。

所以应当在函数内部定义通过decltype拿到返回值。

使用返回类型后置语法的加法函数:

template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u)
{
    return t + u;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值