【C++11新特性】 auto关键字
原文链接: http://blog.csdn.net/xiejingfa/article/details/50469045
熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如python,可以直接声明变量,在运行时进行类型检查。随着C++11标准的发布,C++语言也引入了类型自动推断的功能,这就是我们今天要介绍的auto关键字。
C++是一种强类型语言,声明变量时必须明确指出其类型。但是,在实践中,优势我们很难推断出某个表达式的值的类型,尤其是随着模板类型的出现,要想弄明白某些复杂表达式的返回类型就变得更加困难。为了解决这个问题,C++11重新定义了auto关键字的语义,用于进行自动类型推断。为什么说“重新定义”呢?auto关键字在C++98中已经出现,用于自动变量的声明,但是极少被使用(关于此定义,可以查看这里)。
用法
C++引入auto关键字主要有两种用途:一是在变量声明时根据初始化表达式自动推断该变量的类型,二是在声明函数时作为函数返回值的占位符。对于自动类型推断,C++11中也有一个类似的关键字decltype,感兴趣的童鞋可以继续关注我的博客,今天我们主要来讲解一些auto关键字的用法。
自动类型推断
使用auto从初始化表达式中推断出变量的数据类型,可以大大简化我们的编程工作,特别是对于一些类型冗长复杂的变量。比如,在以前的做法中,对于vector类型的变量,如果我们需要获取它的迭代器,我们需要这样声明vector::iterator iter,而使用auto关键字后我们可以让编译器帮我们推断出迭代器的具体类型。另外,在模板函数定义时,如果变量的类型依赖于模板参数,我们也很难确定变量的类型,使用auto关键字则可以把这些“脏活累活”交给编译器完成。
下面看一些简单的例子:
#include <iostream>
#include <vector>
using namespace std;
template<class T, class U>
void add(T t, U u)
{
auto s = t + u;
cout << "type of t + u is " << typeid(s).name() << endl;
}
int main()
{
// 简单自动类型推断
auto a = 123;
cout << "type of a is " << typeid(a).name() << endl;
auto s("fred");
cout << "type of s is " << typeid(s).name() << endl;
// 冗长的类型说明(如迭代器)
vector<int> vec;
auto iter = vec.begin();
cout << "type of iter is " << typeid(iter).name() << endl;
// 使用模板技术时,如果某个变量的类型依赖于模板参数,使用auto确定变量类型
add(101, 1.1);
}
函数返回值占位符
在这种情况下,auto主要与decltype关键字配合使用,作为返回值类型后置时的占位符。此时,关键字不表示自动类型检测,仅仅是表示后置返回值的语法的一部分。
示例如下:
template<class T, class U>
auto add(T t, U u) -> decltype(t + u)
{
return t + u;
}
注意事项
1、使用auto关键字的变量必须有初始值。
2、可以使用valatile,*(指针类型说明符),&(引用类型说明符),&&(右值引用)来修饰auto关键字。
auto a = 10;
auto *pa = new auto(a);
auto **rpa = new auto(&a);
cout << typeid(a).name() << endl; // 输出: int
cout << typeid(pa).name() << endl; // 输出: int *
cout << typeid(rpa).name() << endl; // 输出: int **
3、函数参数和模板参数不能被声明为auto。
4 、使用auto关键字声明变量的类型,不能自动推导出顶层的CV-qualifiers和引用类型,除非显示声明。例如:
- 使用auto关键字进行类型推导时,如果初始化表达式是引用类型,编译器会去除引用,除非显示声明。例如:
int i = 10;
int &r = i;
auto a = r;
a = 13; // 重新赋值
cout << "i = " << i << " a = " << a << endl; // 输出i=10,a=13
// 显式声明
auto &b = r;
b = 15; // 重新赋值
cout << "i = " << i << " b = " << b << endl; // 输出i=15,a=15
- 使用auto使用auto关键字进行类型推导时,编译器会自动忽略顶层const,除非显示声明。例如:
const int c1 = 10;
auto c2 = c1;
c1 = 11; // 报错,c1为const int类型,无法修改const变量
c2 = 14; // 正确,c2为int类型
// 显示声明
const auto c3 = c1;
c3 = 15; // 报错,c3为const int类型,无法修改const变量
5、对于数组类型,auto关键字会推导为指针类型,除非被声明为引用。例如:
int a[10];
auto b = a;
cout << typeid(b).name() << endl; // 输出:int *
auto &c = a;
cout << typeid(c).name() << endl; // 输出:int [10]
【C++11新特性】 auto关键字的更多相关文章
- C++11新特性— auto 和 decltype 区别和联系
一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准 ...
- 【C++11】新特性——auto的使用
[C++11]新特性——auto的使用 C++11中引入的auto主要有两种用途:自动类型推断和返回值占位.auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后 ...
- C++11新特性总结 (二)
1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...
- C++11新特性总结 (一)
1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...
- c++11新特性(了解)
从C++出来到现在已经13年了. Bjarne Stroustrup(C++的创造者)最近评价C++:”感觉像个新的语言“. 事实上,C++11核心已经发生了很重大的变化: . 支持Lambda表达式 ...
- [转载] C++11新特性
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
- C++ 11 新特性
C++11新特性: 1.auto 2.nullptr 3.for 4.lambda表达式 5.override ...
随机推荐
- Redis学习第八课:Redis高级实用特性(一)
Redis高级实用特性 注:我学习的环境是vmware7.1 + ubantu10.10+ redis 3.0.2 1.安全性 设置客户端连接后进行任何其他指定前需要的密码.因为redis速度相当快, ...
- WebGL编程指南案例解析之3D视图视区问题
var VSHADER_SOURCE = 'attribute vec4 a_Position;\n' + 'attribute vec4 a_Color;\n' + 'uniform mat4 u_ ...
- https页面证书验证、加密过程简介
1.服务器向CA机构获取证书(假设这个证书伪造不了),当浏览器首次请求服务器的时候,服务器返回证书给浏览器.(证书包含:公钥+申请者与颁发者的相关信息+签名) 2.浏览器得到证书后,开始验证证书的相关 ...
- Jsonp的实现
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题. 由于同源策略,一般来说位于 server1.com 的网页无法与不是 serv ...
- 一年内自学MIT的33门课? 疯狂学习有方法
[导读]能快速掌握复杂信息,对成就卓越事业至关重要.ScottYoung的学习过程不只适用于学生,同样有助于学习复杂技能的专业知识. 能快速掌握复杂信息,对成就卓越事业至关重要.ScottYoung的 ...
- 2012年东京区域赛 UVAlive6182~6191
暑假训练场 A(UVAL6182). 凯神看了敲掉的题目,还没有看过 #include <iostream> #include <memory.h> using namespa ...
- hdu2602 DP (01背包)
题意:有一个容量 volume 的背包,有一个个给定体积和价值的骨头,问最多能装价值多少. 经典的 01 背包问题不谈,再不会我就要面壁了. 终于有一道题可以说水过了 ……心好累 #include&l ...
- jQuery prop() 方法
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- LG1419 【寻找段落】
前言 鉴于这题的题解质量(连LaTeX公式都没有),我决定再发一篇详细的题解,不仅方便大家,还可以作为我学习单调队列优化dp的小结(尽管这题不是dp). 分析 题目要求求一个最大的实数\(x\),使得 ...
- maven学习--进阶篇
2016-01-06 02:34:24 继承与聚合 (八)maven移植 讲到maven移植,大家可能第一反应就是是指将一个java项目部署到不同的环境中去,实际上,在maven中,它认为当你参加一个 ...