[008]C/C++系列 | C++11 auto & decltype

一、背景

C++ 11引入了auto & decltype 实现类型推导,在某种意义上提供了无需操心变量类型的习惯(类似弱类型语言)。

 

二、auto

使用 auto 进行类型推导的一个最为常见而且显著的例子就是迭代器。例如:

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

替换为auto:

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

注意:

auto不能用于函数传参!!!(重载)

即:

int add(auto x, auto y);

 

三、decltype 

decltype 关键字是为了解决 auto 关键字只能对变量进行类型推导的缺陷而出现的。

注意:auto可用于数组

int arr[10] = {0};
auto auto_arr = arr;
auto auto_arr2[10] = arr;

 3.1用法

// decltype(表达式)
auto x = 1;
auto y = 1;
decltype(x + y) z;

3.2尾返回类型、auto 与 decltype 配合

你可能会思考,auto 能不能用于推导函数的返回类型。考虑这样一个例子加法函数的例子,在传统 C++ 中我们必须这么写:

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

备注:

typename 和 class 在模板中没有区别,在 typename 这个关键字出现之前,都是使用 class 来定义模板参数的

这样的代码其实变得很丑陋,因为程序员在使用这个模板函数的时候,必须明确指出返回类型。但事实上我们并不知道 add() 这个函数会做什么样的操作,获得一个什么样的返回类型。

在 C++11 中这个问题得到解决。虽然你可能马上回反应出来使用 decltype 推导 x+y 的类型,写出这样的代码:

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

但事实上这样的写法并不能通过编译。这是因为在编译器读到 decltype(x+y) 时,x 和 y 尚未被定义。为了解决这个问题,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;
}

 

// 参考链接

https://www.lanqiao.cn/courses/605/learning/?id=2023 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值