什么是C++0x?

C++0x是C++最新标准标准化过程中的曾用名,在这一系列文章中我们将介绍最新标准添加的一系列新的语言特性。在2011年9月份,C++0x正式由官方发布并命名C++11,现在很多编译器已经支持了部分C++11特性。

C++11包括大量的新特性:主要特征像lambda表达式和移动语义,实用的类型推导关键字auto,更简单的容器遍历方法,和大量使模板更容易使用的改进。这一系列教程将包含所以以上特性。

你该关注C++11吗?

很明显,C++11为C++带来了大量的新特性。C++11将修复大量缺陷和降低代码拖沓,比如lambda表达式的支持将使代码更简洁。像移动语义这种特性会提高语言内核的基础效率,使你可以写出更快的代码。对模板系统的优化可以使你更容易写出泛型的代码。

新的标准库同时也会包含新的特性,包括对多线程的支持和优化智能指针,后者将给那些还没用类似于boost::shared_ptr的人提供更简单的内存管理方法。

我已经开始使用新的C++11特性,并且非常喜欢:新的auto关键字,对模板”>>“写法的支持,lambda表达式和新的函数定义语法。

C++11是如何开发出来的?

C++11的出现,首先要感谢C++标准委员会的辛勤工作,一群来自学术界和工业界的专家,他们的多次会晤攻克难题,终于设计出了一种跨平台,被多种编译器支持,可以生成高效易维护代码的语言。而C++11新标准,就像对灵活强大的C++的一次不可思议的扩展。

C++11包括什么?

更易用的语言

使用过C++11后,我发现它提供了大量的基础方法使C++变成了一种更易使用的语言。这不是说它变成了简单的语言—这里有大量的新特性—提供了大量的方法使编程更容易。让我们看一个例子,auto关键字。在C++11中,假如编译器可以从变量的初始化中得到它的类型,那么你不必要指定类型。比如,你可以这样写:

int x = 3;
auto y = x;

编译器可以推导出y的类型是int。当然,这不是一个证明auto有用的一个闪亮的例子。当使用模板特别是STL时auto很好用。为什么这么说,想象使用一个迭代器(iterator):

map<string, string> address_book;
address_book["Alex"] = "webmaster@towriting.com";
//add a bunch of people to address_book

现在你想遍历address_book中的元素,要这样做,你需要一个迭代器:

map<string, string>::iterator iter = address_book.begin();

这是一个恐怖的长类型声明,当你已经知道这个类型的时候。这样是不是简洁多了:

auto iter = address_book.begin();

代码变得更简单明了,我觉得可读性也更高了,因为模板语法使这一行其它内容变模糊了。这是我特别喜欢的一个特性,我发现它消除了许多头疼和难以追踪的编译错误,节省了时间而没有丢掉表达式的意思。

区间迭代(range-based for loop)

下面迭代器的例子是C++11提供的一种处理迭代的更好方法,有些人叫做区间迭代(基本上所有的现代语言都支持)。这个例子足够证明这种语法是多么优雅:

vector<int> vec;
vec.push_back(10);
vec.push_back(20); for (int &i: vec)
{
cout<<i;
}

你需要做的就是给出一个变量和要迭代的区间。但是如果你想迭代一个map怎么办?你怎么设置map中值的类型?你知道vector值的类型是int。但map的值类型是pair,通过.first和.second给你提供键和值。但是用auto,你根本无需关心确切类型,你可以简单的写成:

for (auto address_entry: address_book)
{
cout<<address_entry.first<<" "<address_entry.second<<endl;
}

这将打印出:

Alex webmaster@towriting.com

这是一个不错的C++11新特性组合用法吧?

>>(right angle brackets)

我这里还有更易用的优化—在以前的C++标准中,假如你写一个含有其他模板类型的模板:

vector<vector<int> > vector_of_int_vectors;

你必须在结束的两个’>‘之间添加空格。这不仅烦人,而且当你写成>>而没有空格时,你将得到困惑和误导的编译错误信息。产生这种行为的原因是C++词法分析的最大匹配原则(maximal munch rule)。一个好消息是从今往后,你再也不用担心了:

vector<vector<int>> vector_of_int_vectors;

对,这确实是个小东西,不过却是人工代码克服机器工具的胜利。另外,这样写就不那么丑了。

多线程

这是第一次,C++11将包含一种内存模型和对应的多线程库,这意味着你将可以编写符合标准的多线程代码。新标准将提供所有的通用线程方法,比如线程、线程局部存储和原子操作。它也提供了一系列有趣的特性:futures和promises。futures和promises的主要思想是,你可以编写代码表示,“这个对象,一个future代码还没计算完的结果”,它将可以在后台计算结果。当这个值需要的时候,你向future发请求,假如这个值准备好了,那就可以得到它,要不然继续等待。

我将在后续的文章中深入探讨多线程。

还有好多其他的东西

C++11特性的数量是客观的。你可以阅读维基百科里的C++11页面,而我计划在这一系列文章中深入探索这些特性,包括:

C++11的编译器支持

当然,如果无法使用再好的语言特性又有什么用,好消息是大量的编译器已经开始支持C++11。Apache基金会整理了一个列表,列出了C++11的语言特性和编译器的支持情况:支持C++11的编译器。假如你对GCC感兴趣,这里有GCC4.7支持C++11

有些编译器,比如GCC,不会默认支持这些新特性—例如,为了支持C++11特性,编译时必须指定 -std=c++0x。当然这也是很有用的,你可以在你的项目中选择编译器和语言集。

from:http://towriting.com/blog/2013/08/01/what-is-cpp11/

C++11系列-什么是C++11的更多相关文章

  1. C++11 并发指南一(C++11 多线程初探)

    引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...

  2. C++11 并发指南一(C++11 多线程初探)(转)

    引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...

  3. 【C/C++开发】C++11 并发指南一(C++11 多线程初探)

    引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...

  4. GTAC 2015将于11月10号和11号召开

    今年的GTAC注册已经结束,将会在11月10号和11号在Google马萨诸塞州剑桥办公室召开.大家可以关注https://developers.google.com/google-test-autom ...

  5. int和integer;Math.round(11.5)和Math.round(-11.5)

    int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...

  6. 本周MySQL官方verified/open的bug列表(11月15日至11月21日)

    本周MySQL verified的bug列表(11月15日至11月21日) 1. Bug #70923    Replication failure on multi-statement INSERT ...

  7. 本周MySQL官方verified/open的bug列表(11月8日至11月14日)

    本周MySQL verified的bug列表(11月8日至11月14日) 1. Bug #70859-DWITH_EXAMPLE_STORAGE_ENGINE=1 is ignored     URL ...

  8. 本周MySQL官方verified的bug列表(11月1日至11月7日)

    本周MySQL verified的bug列表(11月1日至11月7日) 1.Bug #70839JSON_VALID allows to have two elements with the same ...

  9. 转如何升级oracle版本?(11.2.0.1至11.2.0.4)

    dbua from 11.2,0.2 to 11.2.0.4 need 2hours 升级结果: 步骤名             日志文件名       状态 升级前操作   PreUpgrade.l ...

随机推荐

  1. Eclipse报错:Setting property 'source' to 'org.eclipse.jst.jee.server:xx' did not find a matching property

    Shell代码   警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to ' ...

  2. 【转载】eclipse设置护眼色详细教程

    先上一张效果图:     下面开始设置: 首先设置代码区的背景色: Window–>preference-->General-->Editors-->Test Editors ...

  3. Linux常用命令——链接命令

    链接命令:ln ln -s [原文件] [目标文件] 命令英文原意:link 功能描述:生成链接文件 选项:-s 创建软链接,也叫符号链接 硬链接特征: 1.拥有相同的i节点和存储block块,可以看 ...

  4. C++ 类的初始化列表

    class Animal{public: Animal(int weight,int height): //A初始化列表 m_weight(weight), m_height(height) { } ...

  5. Codeforces Round #470 Div. 2题解

    A. Protect Sheep time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  6. 关于C++中字符串输入get与getline的区别

    最近使用C++中自己老是忘记的一个点,get与getline的区别. 1.get与getline get和getline所属iostream类,作用是读取一整行,通过换行符确定读取结束,他们都可以读取 ...

  7. DayLight Saving Light(HDU6010)

    传送门:DayLight Saving Light 夏令时: 夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度, ...

  8. MySQL6

    MySQL数据库6 1. 集群概述 性能达到瓶颈的解决方案 Scale Up 向上扩展能力,如增加更好的硬件固态磁盘,加大内存等,成本高,效果不显著 Scale Out 向外扩展,例如建立更多的服务器 ...

  9. LVS集群的三种工作模式

    LVS的三种工作模式: 1)VS/NAT模式(Network address translation) 2)VS/TUN模式(tunneling) 3)DR模式(Direct routing) 1.N ...

  10. Linux上安装Hadoop集群(CentOS7+hadoop-2.8.0)--------hadoop环境的搭建

    Linux上安装Hadoop集群(CentOS7+hadoop-2.8.0)------https://blog.csdn.net/pucao_cug/article/details/71698903 ...