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的类型,这样就会变的很复杂很难读懂。于是就改变了语法规则,把decltype(t1 + t2)放到函数的后方,并用auto作为返回值来告诉编译器,真正的返回值在函数声明之后。简单的说auto可以作为返回值占位符来使返回值后置。

时间: 2024-10-08 11:48:27

C++ 11 学习1:类型自动推导 auto和decltype的相关文章

C++11 自动推导auto

C++11 自动推导auto C++11中引入的auto主要有两种用途:自动类型推导和返回值占位. auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后两个标准的auto,完全是两个概念. 自动类型推导 auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以大大简化我们的编程工作. auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响.另外,auto并不会影响编译速度,因为编译时本来

类型别名,auto,decltype

1.类型别名 类型别名是某种类型的同义词. 1 int main() 2 { 3 typedef char *ps; // ps是类型char*的别名 4 const ps p1 = 0; // p1是指向char的常量指针 5 const ps *p2; // p2是一个指针,它的对象是指向char的常量指针 6 return 0; 7 } 注意:遇到使用了类型别名的声明语句时,人们往往会错误地尝试把类型别名替换成它本来的样子去理解,这种理解方法是错误的:要将类型别名看成是一个基本数据类型去理

C++11 - 类型推导auto关键字

c++11中,auto关键字被作为类型自动推导关键字,借助于auto关键字,可对变量进行隐式的类型定义,即由编译器在编译期间根据变量的初始化语句,自动推断出该变量的类型. 1.基本用法 (1)基本用法: auto 变量名 = 初值; 1 2 3 4 auto a = 1;  //a被推导为int类型的 auto b = new auto(2); //b被推导为int* auto const *c = &a; auto const *d = 3; (2)在旧语法中,auto类型变量存储于栈区,st

C++11新特性:自动类型推断和类型获取

声明:本文是在Alex Allain的文章http://www.cprogramming.com/c++11/c++11-auto-decltype-return-value-after-function.html的基础上写成的. 加入了很多个人的理解,不是翻译. 转载请注明出处 http://blog.csdn.net/srzhz/article/details/7934483 自动类型推断 当编译器能够在一个变量的声明时候就推断出它的类型,那么你就能够用auto关键字来作为他们的类型: [c

Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化,struts2的文件上传下载. 把这几个功能都学会了使用之后,struts2基本上就学完了.所以接下来的文章就是对这几个功能进行讲解.如何使用.

C++11学习

C++11学习 本章目的: 当Android用ART虚拟机替代Dalvik的时候,为了表示和Dalvik彻底划清界限的决心,Google连ART虚拟机的实现代码都切换到了C++11.C+11的标准规范于2011年2月正式落稿,而此前10余年间,C++正式标准一直是C++98/03[①].相比C++98/03,C++11有了非常多的变化,甚至一度让笔者大呼不认识C++了[②].不过,作为科技行业的从业者,我们要铭记在心的一个铁规就是要拥抱变化.既然我们不认识C++11,那就把它当做一门全新的语言来

C++ 11新特性的用法之auto

一.静态类型,动态类型和类型推导 在编程语言分类中,C/C++C常常被认为是静态类型的语言.而有的编程语言则号称是"动态类型"的,比如python.通常情况下,"静"和"动"的区别是非常直观的.我们看看下面这段简单的python代码: name='world\n' print 'hello, ' %name 这段代码中python中的一个hellowworld的实现.这就是编程语言中的"动态类型",在运行时来进行类型检查,而C

C++11之auto和decltype

auto自动类型推断,用于从初始表达式中推断出变量的类型. auto a; // 错误,没有初始化表达式,无法推断出a的类型 auto int a = 10; // 错误,auto临时变量的语义在C++ 11中已不存在 auto a = 10; auto c = 'A'; auto s("hello"); vector<int> vctTemp; auto it = vctTemp.begin(); auto ptr = [](){ cout << "

C++11的auto和decltype关键字

今天Mayuyu要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已经就有了auto关键字,只不过在C++98中auto表示的是临时变量的语义,而在C++11中auto表示自动类型推导,如下 auto关键字可以从表达式中推导出变量的类型,这样就大大简化了编程人员的工作.而且auto是在编译时对变量进行了类型推导,所以不会对程序的效率造成影响,另外auto也不会对编译速度造成太大影响,因为编译时本身也要右侧推导后判断是否与左侧匹配. 另外auto在模板编程中也