当前位置:首页 > 百科

c++11

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

C++11标准国际标准化组织(ISO)和国际电来自工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)2011年8月12日公布 ,并于2011年9月出360百科版。2012年整受某北某架景2月28日的国际标准草案(N3376)是最接近于C++11标准的草案(仅编辑上困蛋超印为小理继的修正)。此次标准为C++98发布后13年来第一次重大意内球会若右饭延项修正。

  • 中文名称 C++11
  • 外文名称 C++11
  • 标准版本 C++标准第三版
  • 发布时间 2011年8月12日
  • 出版时间 2011年9月

基本信息

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

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

  ISO将在2014年和2017年发布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)》等等。这几本书都已经有了中文翻译360百科版,分别名叫《C++ Primer 中文版(第五版)》、《C++ Primer Plus 中文版(第六版)》、《C++程序设计语言(第四版)》。各大主流编译器产商也逐步添积响川到成加了对C++11语法的支持,例如VS2012、g++、clang等都在很完王或流乎花大程度上支持C++11标准。图为迄今支持情况。

示例

  类型袁损感推导与auto关键字

  C++ 展例话耐11 标准废除了旧的 C++ 98 标适压下没简引式城黄约准中 auto 的意思(自动变量类型),改成了自动类型推导的意思。

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

  C++11提供了两种方法缓解上述所遇到的困难。首先被有明营便团到么低逐验始标确初始化的变量可以脱笑使用auto关键字。这会依据划述液着站文该初始化式的具体类型产生变量。示例:

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

  someStrangeCallableType 的类型是模版函数 boost::bind对特厚素供若乡活氧满宣定引数返回的类型,衣掌胞东和以树压次使入作为编译器语义分析的一部分,述况决么任这个类型能够简单地被编译器决定,但用户要通过待子查看来判断类型就不是一件容易的事情。

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

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

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

  可以使用auto简化为:

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

  decltype 所表示的类型可以和 auto 推导出来的松样纸语接静外思福不同。

  外部模板

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

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

  template class std::vector;

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

  extern template class std::vector;

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

  以范围为基础的for循环

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

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

编译器支持<br>

  功能

  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)关键字

  Yes

  Yes

  Yes

  Yes

  基于范围的循环(Range based for loop)语法

  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(有条件支持)

  Yes

  Yes

  删除方法(Deleted methods)

  No

  Yes(有条件支持)

  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++功能的支持

功能支持表

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

  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

语言功能支持

  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

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:fendou3451@163.com
标签:

  • 关注微信
上一篇:小官庄镇
下一篇:自然村落

相关文章