C++11/14学习(二)类型推导

C++11 引入了 auto 和 decltype 这两个关键字实现了类型推导,让编译器来操心变量的类型。
这使得 C++ 也具有了和其他现代编程语言一样,某种意义上提供了无需操心变量类型的使用习惯。

一. auto

C++11之前:如果一个变量没有声明为 register变量,将自动被视为一个 auto 变量。
C++11开始:register 被弃用,auto赋予了其他含义,即类型自动推导。

1. 一个最为常见而且显著的例子就是迭代器

传统C++:

for (vector<int>::const_iterator itr = vec.cbegin(); itr != vec.cend(); ++itr)

C++11:

for (auto itr = vec.cbegin(); itr != vec.cend(); ++itr)

2. 一些其他的常见用法

#include <iostream>
int main()
{
	auto i = 5;
	int arr[10] = { 0 };
	auto auto_arr = arr;
	auto auto_arr2[10] = arr;
	return 0;
}

注意: auto 不能用于函数传参,因此下面的做法是无法通过编译的(考虑重载的问题,我们应该使用模板)

int add(auto x, auto y);

二. decltype

decltype 关键字是为了解决 auto 关键字只能对变量进行类型推导的缺陷而出现的。
有时候,我们可能需要计算某个表达式的类型,例如:

auto x = 1;
auto y = 2;
decltype(x + y) z;

三. 尾返回类型、auto 与 decltype 配合

1. 考虑这样一个加法函数的例子

在传统 C++ 中我们必须这么写:

template<typename R, typename T, typename U>
R add(T x, U y)
{
	return x + y
}

这样的代码很丑陋,因为在编写这个模板函数的时候,必须明确指出返回类型,
但事实上我们并不知道这个函数会返回什么类型。

2. C++11 开始这个问题得到解决

你可能马上反应出来使用 decltype 推导x+y 的类型,写出这样的代码:

decltype(x + y) add(T x, U y)

但事实上这样的写法并不能通过编译。
这是因为在编译器读到 decltype(x+y)时, x 和 y 尚未被定义。

3. 尾返回类型(trailing return type)

为了解决上面的问题,C++11 引入了一个叫做尾返回类型(trailing return type) ,
利用 auto 关键字将返回类型后置:

template<typename T, typename U>
auto add(T x, U y) -> decltype(x + y)
{
	return x + y;
}

C++14 函数具备返回值推导,因此下面的写法变得合法:

template<typename T, typename U>
auto add(T x, U y)
{
	return x + y;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值