C++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)

可是实际这样的写法C++并无克经过编译。
眼看是以以编译器读到 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;

}