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

简介

编辑
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++语言的标准化进程 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语法的支持,例如VS20十二、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
Yes
Yes
Yes
Strongly typed enums
Partial
Yes
Yes
Forward declared enums
No
Yes
Yes
No
No
No
constexpr
No
No
No
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
相关文章
相关标签/搜索