C++C++ 11 学习1:类型自动推导 auto和decltype

Cocos 3.x 用了大气之C++ 11 的物,所以作为一个C++忠实粉丝,有必不可少对C++
11进行一个体系的念。

使C++11之前,一定要留心自己以的编译器对C++11之支撑情况,有些编译器并无是了支持,比如自己正在使用的vs2012。这里是msdn里面VS各版本对C++
11 的支持 针对 C++11 功能的支持(现代
C++)

 

1.auto

auto这个要字C++原先就有,用来指定存储器。因为好少有人去用是东西,所以在C++11吃便管原有的auto功能于丢掉了,而成为了现在的型推导关键字。先说下auto的简约用法:

#include <iostream>
#include <vector>
#include <map>
using namespace std;

int main() {
    auto num = 1;  //num 是int类型
    auto c = 'A'; //c 是char类型
    auto str("test"); // str是char数组

    map<string, vector<int>> map;
    for(auto it = begin(map); it != end(map); ++it)  // it 为迭代器类型
    {
    }

    return 0;
}

这么以最显的补益就于利用迭代器遍历STL容器的早晚,不用失去声明那些迭代器的门类,也未用去采用typedef就可知生简短的实现遍历了。

自效率及来说,auto不会见指向运作时效率有影响,它是于编译的时节推导类型的,例如地方的代码,编译的早晚,就见面拿num变量转换为int类型。

auto和其它变量类型有肯定的区分:

1.auto声明之变量必须使初始化,否则编译器不可知判断变量的项目。

2.auto不能被声称也回到值,auto不可知同日而语形参,auto不能被修饰为模板参数

3.

2.decltype

decltype关键字和auto相互照应的,它们常在有场合配合使用。decltype可以在编译的时判断出一个变量或者表达式的档次,例如:

#include <iostream>
#include <vector>
#include <map>
using namespace std;

void func(auto can) {
    int a;
}

int main() {
    auto num = 1;  //num 是int类型
    decltype(num) num2 = num; //num2 也是int类型

    return 0;
}

此地decltype拿到了num的品类,然后据此是类型定义了num2做了num的一样份copy。auto和decltype还有平等栽经典的行使场所,看下面例子:

template <typename T1, typename T2>  
auto compose(T1 t1, T2 t2) -> decltype(t1 + t2)  
{  
   return t1+t2;  
}

此地是故一个模板来算两独变量的加法,如果简单单种类T1和T2不相同吧,t1+t2的项目将由编译器来支配,这样用decltype就可以到回的种。但是要是将decltype(t1
+
t2)放到函数命名的先头作为返回值的语,按照编译器的辨析顺序,当解析到回值decltype(t1
+
t2)的上t1和t2还尚无吃定义,所以要是重复声明t1和t2的门类,这样便见面换的怪复杂很麻烦读懂。

于是C++11就改了语法规则,把decltype(t1 +
t2)放到函数的后,并用auto作为返回值来报告编译器,真正的返值在函数声明后。简单的说auto可以看作返回值占个副来使返回值后置。