c++11介绍

C++11标准是 ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++ 的简称[1]  。

C++11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布[2]  ,并于2011年9月出版。2012年2月28日的国际标准草案(N3376)是最接近于C++11标准的草案(仅编辑上的修正)。此次标准为C++98发布后13年来第一次重大修正。

中文名
C++11
外文名
C++11
标准版本
C++标准第三版
发布时间
2011年8月12日
出版时间
2011年9月
标准文件号
ISO/IEC 14882:2011

目录

  1. 简介
  2. 版本变更
  3. 现状
  4. 示例
  1. 类型推导与auto关键字
  2. 外部模板
  3. VS C++11功能支持表(总表)
  1. 并发能力
  2. VS C++ 11语言功能支持表:C99

简介

编辑

C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++ 。[1]  在正式标准发布前,原名C++0x。它将取代C++标准第二版ISO/IEC 14882:2003 - Programming languages -- C++ 成为C++语言新标准。

C++11包含了核心语言的新机能,并且拓展C++标准程序库,并且加入了大部分的C++ Technical Report 1程序库(数学上的特殊函数除外)。C++ 标准委员会计划在2010年8月之前完成对最终委员会草案的投票,以及于2011年3月3召开的标准会议完成国际标准的最终草案。最终于2011年8月12日公布,并于2011年9月出版。2012年2月28日的国际标准草案(N3376)是最接近于现行标准的草案(编辑上的修正)。此次标准为13年第一次重大修正。

ISO将在2014年和2017年发布C++的后续版本[3]  。

C++语言的标准化进程

版本变更

编辑

1.对C++核心语言的扩充

2.核心语言运行期的强化(右值引用和 move 语义;泛化的常数表达式;对POD定义的修正)

3.核心语言建构期表现的加强(外部模板)

4.核心语言使用性的加强(初始化列表;统一的初始化;类型推导[auto关键字];以范围为基础的 for 循环;Lambda函数与表示法;另一种的函数语法;对象构建的改良;显式虚函数重载;空指针;强类型枚举;角括号;显式类型转换;模板的别名;无限制的unions)

5.核心语言能力的提升(变长参数模板;新的字符串字面值;用户自定义的字面值;多任务存储器模型;thread-local的存储期限;使用或禁用对象的默认函数;long long int 类型;静态assertion;允许sizeof运算符作用在类型的数据成员上,无需明确的对象;)

6.C++标准程序库的变更(标准库组件的升级;线程支持;多元组类型;散列表;正则表达式;通用智能指针;可扩展的随机数功能;包装引用;多态函数对象包装器;用于元编程的类型属性;用于计算函数对象返回类型的统一方法)

现状

编辑

每个标准的发布都需要一段时间的普及。包括技术图书,编译器支持。C++11标准发布后,美国已经更新了大部分著名C++图书,以支持最新的C++11标准,例如:《C++ Primer (Fifth Edition)》、《C++ Primer Plus (Sixth Edition)》、《The C++ Programming Language (4th Edition)》等等。这几本书都已经有了中文翻译版,分别名叫《C++ Primer 中文版(第五版)》、《C++ Primer Plus 中文版(第六版)》、《C++程序设计语言(第四版)》。各大主流编译器产商也逐步添加了对C++11语法的支持,例如VS2012、g++、clang等都在很大程度上支持C++11标准。图为迄今支持情况。

编译器实现情况

示例

编辑

类型推导与auto关键字

C++ 11 标准废除了旧的 C++ 98 标准中 auto 的意思(自动变量类型),改成了自动类型推导的意思。

在标准C/C++,使用变量必须明确的指出其类型(强类型)。然而随着模板类型的出现以及模版元编程的技巧,指定类型,特别是函数定义明确的指定返回类型,就不容易表示。在这样的情况下,将中间结果存储与变量是一件困难的事情,可能会需要知道特定的元编程程序库的内部情况。

C++11提供了两种方法缓解上述所遇到的困难。首先被有明确初始化的变量可以使用auto关键字。这会依据该初始化式的具体类型产生变量。示例:


1

auto otherVariable = 5;//otherVariable被按照int型来编译

otherVariable 的类是明确定义的。因为5的类型是int,所以编译器按照“int otherVariable =5;”来编译。


1

auto someStrangeCallableType = boost::bind(&SomeFunction,_2,_1,someObject);

someStrangeCallableType 的类型是模版函数 boost::bind对特定引数返回的类型,作为编译器语义分析的一部分,这个类型能够简单地被编译器决定,但用户要通过查看来判断类型就不是一件容易的事情。

除此之外,C++11还定义了 decltype 能够被用来在编译器决定一个表达式的类型。举例:


1

2

int someInt;

decltype(someInt) otherIntegerVariable = 5;

decltype 和 auto 一起使用会更为有用,因为 auto 变量的类型只有编译器知道。然而 decltype 对于那些大量运用运算符重载和特化的类型的代码的表示也非常有用。

auto 对于减少冗赘的代码也很有用。举例而言,程序员不用写像下面这样:


1

for(vector<int>::const_iteratoritr=myvec.begin(); itr!=myvec.end(); ++itr)

可以使用auto简化为:


1

for(auto itr = myvec.begin(); itr != myvec.end(); ++itr)

这项差异随着程序员开始嵌套容器而更为显著,虽然在这种情况下 typedef 是一个减少代码的好方法。

decltype 所表示的类型可以和 auto 推导出来的不同。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

#include<vector>

int main()

{

    const std::vector<int>v(1);

    auto a = v[0];//a为int类型

    decltype(v[0]) b = 0;//b为const int&类型,即std::vector<int>::operator[](size_type)const的返回类型

    auto c = 0;//c为int类型

    auto d = c;//d为int类型

    decltype(c) e;//e为int类型,c实体的类型

    decltype((c)) f = e;//f为int&类型,因为(c)是左值

    decltype(0) g;//g为int类型,因为0是右值

    return 0;

}

外部模板

在标准C++中,只要在编译单元内遇到被完整定义的模板,编译器都必须将其实例化(instantiate)。这会大大增加编译时间,特别是模板在许多编译单元内使用相同的参数实例化。看起来没有办法告诉C++不要引发模板的实例化。

C++11将会引入外部模板这一概念。C++已经有了强制编译器在特定位置开始实例化的语法:

template class std::vector<MyClass>;

而C++所缺乏的是阻止编译器在某个编译单元内实例化模板的能力。C++11将简单地扩充前文语法如下:

extern template class std::vector<MyClass>;

这样就告诉编译器不要在该编译单元内将该模板实例化。

以范围为基础的for循环

Boost C++ 定义了许多"范围 (range) "的概念。范围表现有如受控制的串行 (list),持有容器中的两点。有序容器是范围概念的超集 (superset),有序容器中的两个迭代器 (iterator) 也能定义一个范围。这些概念以及操作的算法,将被并入 C++11 标准程序库。不过 C++11 将会以语言层次的支持来提供范围概念的效用。

for 语句将允许简单的范围迭代:第一部分定义被用来做范围迭代的变量,就像被声明在一般for循环的变量一样,其作用域仅只于循环的范围。而在":"之后的第二区块,代表将被迭代的范围。这样一来,就有了能够允许C-style数组被转换成范围概念的概念图。这可以是std::vector,或是其他符合范围概念的对象。


1

2

3

4

5

int my_array[5]={1, 2, 3, 4, 5};

for(int& x : my_array)

{

x *= 2;

}

编译器支持
  
功能
  
VS2011
  
VS2013 g++ 4.7
  
Clang 3.1
  
auto关键字
  
Yes
  
Yes
  
Yes Yes
decltype关键字 Yes
  
Yes
  
Yes Yes
右值引用(Rvalue references)与移动语义(move semantics) Yes
  
Yes
  
Yes Yes
Lambda表达式
  
Yes
  
Yes
  
Yes Yes
nullptr关键字 Yes
  
Yes
  
Yes Yes
静态断言(static_assert)关键字[4]  
  
Yes
  
Yes
  
Yes Yes
基于范围的循环(Range based for loop)语法[5]  Yes
  
Yes
  
Yes Yes
函数返回类型后置(Trailing return type in functions)语法 Yes
  
Yes
  
Yes Yes
final关键字 Yes
  
Yes
  
Yes Yes
override关键字 Yes
  
Yes
  
Yes Yes
强类型枚举(Strongly typed enums) Yes
  
Yes
  
Yes Yes
前置枚举声明(Forward declared enums)
  
Yes
  
Yes
  
Yes Yes
外部模板(extern templates) Yes
  
Yes
  
Yes Yes
模板右尖括号嵌套(>> for nested templates) Yes
  
Yes
  
Yes Yes
Local and unnamed types as template arguments Yes
  
Yes
  
Yes Yes
变参宏(Variadic macros) Yes
  
Yes
  
Yes Yes
新内建类型(New built-in types) Partial(部分) ? Yes Yes
Initializer_lists容器 No ? Yes Yes
显式类型转换运算符(explicit type conversion operators) No Yes
  
Yes Yes
内联命名空间(Inline namespaces) No ? Yes Yes

sizeof用在没实例时的非静态成员

(sizeof on non-static data members without an instance)

No ? Yes Yes
改变union成员限制(Changed restrictions on union members) No ? Yes Yes
Raw string literals
  
No Yes Yes Yes
User defined literals
  
No ? Yes Yes
Encoding support in literals
  
No ? Yes Yes
Arbitrary expressions in template deduction contexts
  
No ? Yes Yes
默认方法(Defaulted methods)
  
No Yes(有条件支持)[6]  Yes Yes
删除方法(Deleted methods)
  
No Yes(有条件支持)[6]  Yes Yes
非静态成员初始化(Non-static data member initializers)
  
No ? Yes Yes
变参模板(Variadic templates) No ? Yes Yes

函数模板中的默认模板参数

(Default template arguments in function templates)

No ? Yes Yes
模板别名(Template aliases) No ? Yes Yes
前置构造函数(Forwarding constructors) No ? Yes Yes
noexcept关键字 No ? Yes Yes
constexpr关键字
  
No ? Yes Yes
Alignment 支持
  
Partial(部分) Partial(部分) Yes Yes
*this的右值引用 No ? No Yes
C99兼容性(C99compatibility) Partial(部分) Partial(部分) Partial(部分) Partial(部分)
线程本地存储(Thread local storage) Partial(部分) Partial(部分) Partial(部分)   
构造函数继承(Inheriting constructors) No ? No No
Generalized attributes
  
No ? No No

通过对比可以发现,Clang在大多数C++11功能实现上处于领先地位,而Visual Studio则稍显落后。当然,这三个编译器都有着不错的子集适用于跨平台开发。( 注:GCC4.8.1已完全支持C++11,Clang 3.3 也完全支持了C++11。最新版本的Linux 发行版(RHEL 7,CentOS 7,Ubuntu 14.06,都自带了完全支持C++11的编译器)

你可以使用类型推断、移动语义、右值引用、nullptr,static_assert,range-based参考对比。同时你还可以使用最终和重写关键字来进行友好的控制。此外,你还可以通过Enums(例举)强类型和提前声明,这里有几个改进后的模板包括extern keyword。

遗憾的是,Visual Studio并不支持较多请求的可变参数模板。另一方面,可变参数宏在这三款编译器中只支持C99标准。继承构造函数和广义属性这些特性并不是在任何地方都能获得支持。本地线程存储是是支持情况最好的一部分(通过非关键字标准)。

下面给出在msdn中列举的对C++功能的支持

VS C++11功能支持表(总表)

编辑

以下是Microsoft Visual Studio 2010,2012,2013对C++11支持的比较[7]  。


C++11 Core Language Features

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

Rvalue referencesv0.1,v1.0,v2.0,v2.1,v3.0

v2.0

v2.1*

v2.1*

ref-qualifiers

No

No

No

Non-static data member initializers

No

No

Yes

Variadic templatesv0.9,v1.0

No

No

Yes

Initializer lists

No

No

Yes

static_assert

Yes

Yes

Yes

autov0.9,v1.0

v1.0

v1.0

v1.0

Trailing return types

Yes

Yes

Yes

Lambdasv0.9,v1.0,v1.1

v1.0

v1.1

v1.1

decltypev1.0,v1.1

v1.0

v1.1**

v1.1

Right angle brackets

Yes

Yes

Yes

Default template arguments for function templates

No

No

Yes

Expression SFINAE

No

No

No

Alias templates

No

No

Yes

Extern templates

Yes

Yes

Yes

nullptr

Yes

Yes

Yes

Strongly typed enums

Partial

Yes

Yes

Forward declared enums

No

Yes

Yes

Attributes

No

No

No

constexpr

No

No

No

Alignment

TR1

Partial

Partial

Delegating constructors

No

No

Yes

Inheriting constructors

No

No

No

Explicit conversion operators

No

No

Yes

char16_t/char32_t

No

No

No

Unicode string literals

No

No

No

Raw string literals

No

No

Yes

Universal character names in literals

No

No

No

User-defined literals

No

No

No

Standard-layout and trivial types

No

Yes

Yes

Defaulted and deleted functions

No

No

Yes*

Extended friend declarations

Yes

Yes

Yes

Extended sizeof

No

No

No

Inline namespaces

No

No

No

Unrestricted unions

No

No

No

Local and unnamed types as template arguments

Yes

Yes

Yes

Range-based for-loop

No

Yes

Yes

override and finalv0.8,v0.9,v1.0

Partial

Yes

Yes

Minimal GC support

Yes

Yes

Yes

noexcept

No

No

No

并发能力

编辑


C++11 Core Language Features: Concurrency

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

Reworded sequence points

N/A

N/A

N/A

Atomics

No

Yes

Yes

Strong compare and exchange

No

Yes

Yes

Bidirectional fences

No

Yes

Yes

Memory model

N/A

N/A

N/A

Data-dependency ordering

No

Yes

Yes

Data-dependency ordering: function annotation

No

No

No

exception_ptr

Yes

Yes

Yes

quick_exit

No

No

No

Atomics in signal handlers

No

No

No

Thread-local storage

Partial

Partial

Partial

Magic statics

No

No

No

VS C++ 11语言功能支持表:C99

编辑


C++11 Core Language Features: C99

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

__func__

Partial

Partial

Partial

C99 preprocessor

Partial

Partial

Partial

long long

Yes

Yes

Yes

Extended integer types

N/A

N/A

N/A
时间: 2024-08-10 23:29:20

c++11介绍的相关文章

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

引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧,和大家共勉. 相信 Linux 程序员都用过 Pthread, 但有了 C++11 的 std::thread 以后,你可以在语言层面编写多线程程序了,直接的好处就是多线程程序的可移植性得到了很大的提高,所以作为一名 C++ 程序员,熟悉 C++11 的多线程编程方式还是很有益处的. 如果你对 C+

集中式日志系统 ELK 协议栈详解

1.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便. 1.1.2 elasticsearch几个重要术语 NRT elasticsea

注解:@Autowired

Spring的bean对象自动装配注解,@Autowired有三种使用方式,下面分别介绍! 1. 作用于类成员变量上,即在定义类的成员变量的时候,至于其上方. 1 public class Mobile{ 2 /* 3 *在spring加载bean的时候,会扫描Brand类型的bean,并将其赋值给brand,无需再为brand 4 *写set或者get方法. 5 */ 6 @Autowired 7 private Brand brand 8 .... 9 } 2.作用于类的成员函数上,确切的说

内存分配器 (Memory Allocator)

对于大多数开发者而言,系统的内存分配就是一个黑盒子,就是几个API的调用.有你就给我,没有我就想别的办法.来UC前,我就是这样认为的.实际深入进去时,才发现这个领域里也是百家争鸣,非常热闹.有操作系统层面的内存分配器(Memory Allocator),有应用程序层面的,有为实时系统设计的,有为服务程序设计的.但他们的目的确认一样的,平衡内存分配的性能和提高内存使用的效率. 从浏览器开发的角度看,手机内存的增长速度相对于网页内容的增长仍然只是温暖水平,像Android这样的用内存大户更要算计着用

一种绝对提高开发水平的方法

一.概要 英语对提升软件开发水平非常重要. 如果你英文水平不高,这并不影响你成为一个普通程序员,程序更多是靠逻辑思维. 如果做了多年开发的你发现自己的水平一直上不去,你要提高自己的英文水平了. 我周围的高水平的开发者英文都不差,官方API没问题. 英语是世界上使用最广泛的语言之一,是欧盟.许多国际组织与英联邦国家的官方语言之一.如今英语也是与电脑联系最密切的语言,大多数编程语言都与英语有关系. 英语在软件行业.编程世界里都占有压倒性的优势,它能够帮助人们在关键词和代码库的选择上带来灵感.根据HO

高级php面试题及部分答案

在网上看到一些高级php 的面试题目.. 闲来无事,搞了一些答案...可能不是很全面,留这以后备用吧. 一. 基本知识点1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302...200 : 请求成功,请求的数据随之返回.301 : 永久性重定向.302 : 暂时行重定向.401 : 当前请求需要用户验证.403 : 服务器拒绝执行请求,即没有权限.404 : 请求失败,请求的数据在服务器上未发现.500 : 服务器错误.一般服务器端程序执行错误.

LTE:上行调度请求(Scheduling Request,SR) LTE:下行资源分配类型

http://blog.sina.com.cn/s/blog_927cff010101a7yh.html 上行调度请求(Scheduling Request,SR) 如果UE没有上行数据要传输,eNodeB并不需要为该UE分配上行资源,否则会造成资源的浪费.因此, UE需要告诉eNodeB自己是否有上行数据需要传输,以便eNodeB决定是否给UE分配上行资源.为此LTE提供了一个上行调度请求(Scheduling Request,SR)的机制. UE通过SR告诉eNodeB是否需要上行资源以便用

python 各模块

01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支持模块 12 _ _builtin_ _ 模块 121 使用元组或字典中的参数调用函数 1211 Example 1-1 使用 apply 函数 1212 Example 1-2 使用 apply 函数传递关键字参数 1213 Example 1-3 使用 apply 函数调用基类的构造函数 122

Android 使用 DownloadManager 管理系统下载任务的方法

从Android 2.3(API level 9)开始Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作.Download Manager处理HTTP连接并监控连接中的状态变化以及系统重启来确保每一个下载任务顺利完成. 在大多数涉及到下载的情况中使用Download Manager都是不错的选择,特别是当用户切换不同的应用以后下载需要在后台继续进行,以及当下载任务顺利完成非常重要的情况(DownloadManager对于断点续传功能支