c++11/14/17标准你了解多少_c++ 11 和 14-程序员宅基地

技术标签: c 标准  c/c++学习  vs2010/12/13/15支持c 标准  

我们常用的c++,你对它的标准了解多少呢?本文就带你一探c++11新标准。官网链接:https://msdn.microsoft.com/zh-cn/library/hh567368.aspx#featurelist

 

C++11 功能列表

Visual C++ 实现了 C++11 核心语言规范 中的绝大多数功能、许多 C++14 库功能和某些为 C++17 建议的功能。 下表列出了 C++11/14/17 核心语言功能及其在 Visual Studio 2010、Visual Studio 2012 中的 Visual C++、Visual Studio 2013 中的 Visual C++ 和 Visual Studio 2015 中 Visual C++ 中的实现状态。

C++11 核心语言功能表

C++11 核心语言功能 Visual Studio 2010 Visual Studio 2012 Visual Studio 2013 Visual Studio 2015
右值引用 v0.1v1.0v2.0v2.1v3.0 2.0 版 2.1* 版 2.1* 版 v3.0
引用限定符
非静态数据成员初始值设定项
可变参数模板 v0.9v1.0
初始值设定项列表
static_assert
auto v0.9v1.0 v1.0 v1.0 v1.0
结尾返回类型
Lambdas v0.9v1.0v1.1 v1.0 v1.1 v1.1
decltype v1.0v1.1 v1.0 v1.1** v1.1
右尖括号
函数模板的默认模板参数
表达式 SFINAE
别名模板
Extern 模板
nullptr
强类型的枚举 部分
前向声明枚举
特性
constexpr
对齐方式 TR1 部分 部分
委托构造函数
继承构造函数
显式转换运算符
char16_t/char32_t
Unicode 字符串文本
原始字符串文本
文本中的通用字符名
用户定义的文本
标准布局和普通类型
默认函数和已删除的函数 是*
扩展的友元声明
扩展的 sizeof
内联命名空间
无限制的联合
作为模板参数的本地和未命名类型
基于范围的 for 循环
override 和 final v0.8v0.9v1.0 部分
最低 GC 支持
noexcept

[本文内容]

C++11 核心语言功能表:并发

C++11 核心语言功能:并发 Visual Studio 2010 Visual Studio 2012 Visual Studio 2013 Visual Studio 2015
改写的序列点 不可用 不可用 不可用
原子
强比较和交换
双向界定
内存模型 不可用 不可用 不可用
数据依赖项排序
数据依赖项排序:函数批注
exception_ptr
quick_exit
信号处理程序中的原子化
线程本地存储区 部分 部分 部分
神奇的静态对象

[本文内容]

C++11 核心语言功能:C99

C++11 核心语言功能:C99 Visual Studio 2010 Visual Studio 2012 Visual Studio 2013 Visual Studio 2015
__func__ 部分 部分 部分
C99 预处理器 部分 部分 部分 部分
long long
扩展的整型 不可用 不可用 不可用 不可用

[本文内容]

C++ 14 核心语言功能

     
功能 Visual Studio 2013 Visual Studio 2015
上下文转换的已调整 workding
二进制文本
auto 和 decltype(auto) 返回类型
init-capture
泛型 lambda
变量模板
扩展的 constexpr
聚合的 NSDMI
避免/合成分配
[已弃用] 特性
大小经过调整的分配
数字分隔符

C++17 建议的核心语言功能

     
功能 Visual Studio 2013 Visual Studio 2015
针对自动使用大括号内的初始值设定项列表的新建规则
简要静态断言
模板-参数模板的类型名称
删除三字符组
嵌套的命名空间定义
N4259 std::uncaught_exceptions()
N4261 修复限定转换
N4266 命名空间和枚举器的特性
N4267 u8 字符文本
N4268 允许更多非类型模板参数
N4295 Fold 折叠表达式
等待/继续

 

功能表指南

右值引用

System_CAPS_ICON_note.jpg 说明

以下描述中的版本标识符(v0.1、v1.0、v2.0、v2.1、v3.0)仅用来演示 C++11 的发展。 标准本身不会使用它们。

N1610“通过右值澄清类对象的初始化”是早期在不引用右值的情况下支持移动语义的一种尝试。 为方便讨论,我们称之为“右值引用 0.1 版”。 它由“右值引用 v1.0”取代。 “右值引用 v2.0”是 Visual Studio 2010 中的 Visual C++ 功能的基础,它禁止将右值引用绑定到左值,因此可以解决主要的安全性问题。 “右值引用 v2.1”重新定义了此规则。 让我们看一下 vector<string>::push_back(),它具有重载 push_back(const string&) 和 push_back(string&&) 以及调用 v.push_back("strval")。 表达式 "strval" 是字符串,并且是左值。 (其他文本为右值,如整数 1729,但字符串有些特殊,因为它们是数组。) “右值引用 2.0 版”规则显示,string&& 无法绑定到 "strval",因为 "strval" 是左值,因此 push_back(const string&) 是唯一可行的重载。 这将创建一个临时 std::string,并将它复制到向量中,然后销毁效率不太高的临时 std::string。 “右值引用 2.1 版”规则确认,将 string&& 绑定到 "strval" 将创建临时 std::string,并且该临时字符串为右值。 因此,push_back(const string&) 和 push_back(string&&) 都是可行的,但首选 push_back(string&&)。 将构造一个临时 std::string,然后将它移至向量中。 这样效率更高。

“右值引用 v3.0”将添加新规则,以在特定条件下自动生成移动构造函数和移动赋值运算符。 这是在 Visual Studio 2015 中实现的。

[本文内容]

Lambdas

在 lambda 函数选入到工作文件(“0.9”版)并且已添加可变的 lambda(“1.0”版)之后,标准化委员会全面修订了措词。 这产生了 lambda“1.1”版,这个版本现在已完全受支持。 lambda 1.1 版的措词阐明了在特殊案例(例如引用静态成员或嵌套 lambda)中会发生的情况。 这将修复由复杂 lambda 触发的问题。 此外,无状态的 lambda 现在可转换为函数指针。 这没有包含在 N2927 措词中,但是无论如何都会将它计作 lambda 1.1 版的一部分。C++11 5.1.2 [expr.prim.lambda]/6 具有以下说明:“无 lambda-capture 的 lambda-expression 的闭包类型使用一个公共的非虚拟、非显式常量转换函数指向一个具有与闭包类型的函数调用运算符相同的参数和返回类型的函数。 此转换函数返回的值应为一个函数的地址,调用该函数时,其效果和调用闭包类型的函数调用运算符相同。” (Visual Studio 2012 中的 Visual C++ 实现的效果甚至更好,因为它使无状态的 lambda 可转换为具有任意调用约定的函数指针。 当你在使用期待像 __stdcall 函数指针这类对象的 API 时,这点很重要。)

[本文内容]

decltype

在 decltype 选入到工作文件(1.0 版)后,在最后时刻收到了一个小的但很重要的修复(1.1 版)。 这对从事 STL 和 Boost 工作的程序员很有好处。

[本文内容]

强类型/前向声明枚举

Visual Studio 2010 中的 Visual C++ 部分支持 强类型的枚举(具体而言,支持有关显式指定的基础类型部分)。 现在这些在 Visual Studio 中已完全实现,前向声明枚举的 C++11 语义也已完全实现。

[本文内容]

对齐方式

选入工作文件的对齐方式提案中的核心语言关键字 alignas/alignof 在 Visual Studio 2015 中已实现。 Visual Studio 2010 中的 Visual C++ 具有来自 TR1 的 aligned_storage。Visual Studio 2012 中的 Visual C++ 已将 aligned_union 和 std::align() 添加到标准库,而且重大的问题已在 Visual Studio 2013 中的 Visual C++ 中修复。

[本文内容]

标准布局和普通类型

来自 N2342“POD 重新访问;解决核心问题 568(修订 5)”的公开更改是将 is_trivial 和 is_standard_layout 添加到标准模板库的 <type_traits>。 (N2342 修改了大量核心语言措词,但无需进行编译器更改。) 这些类型特征在 Visual Studio 2010 的 Visual C++ 中已提供,但它们只是复制了 is_pod。 因此,本文档中之前的表显示“不支持”。 它们现在由设计用于给出精确答案的编译器挂钩驱动。

STL 的 common_type 在 Visual Studio 2013 中的 Visual C++ 中得到了迫切需要的修复。common_type<> 的 C++11 规范导致意外后果;具体而言,它使 common_type<int, int>::type 返回 int&&。 因此,Visual Studio 2013 中的 Visual C++ 可实现建议用于库工作组问题 2141 的解决方法,使 common_type<int, int>::type 返回 int

作为此更改的副作用,标识用例不再起作用(common_type<T> 并不总是产生 T 类型)。 这将遵循建议的解决方法,但其将中断依赖于先前行为的所有代码。

如果需要标识类型特征,请不要使用 std::identity 中定义的非标准 <type_traits>,因为它对 <void> 无效。 相反,实现你自己的标识类型特征以满足你的需求。 以下是一个示例:

C++

template <typename T> struct Identity { typedef T type; };  
  

System_CAPS_ICON_note.jpg 说明

有关其他重大更改,请参阅Visual C++ 2015 中的重大更改

[本文内容]

默认函数和已删除的函数

这些函数现在均受支持,但此种情况例外:对于默认函数,不支持使用 =default 请求识别成员的移动构造函数和移动赋值运算符。 复制和移动操作并不按照标准规定的方式进行精确交互 - 例如,指定删除移动会同时禁止显示复制操作,但 Visual Studio 2013 中的 Visual C++ 不会。

有关如何使用默认函数和已删除的函数的信息,请参阅函数

[本文内容]

override 和 final

这经历了短暂而复杂的发展。 最初,在 0.8 版中,具有 [[override]]、[[hiding]] 和 [[base_check]] 特性。 然后在 0.9 版中,消除了这些特性并将其替换为上下文关键字。 最后,在 1.0 版中,将它们精简为类的“final”以及函数的“override”和“final”。 这使它成为一个获得提升的扩展,因为 Visual Studio 2010 中的 Visual C++ 已支持对函数使用此“override”语法,并且语义相当接近于 C++11 中的语义。 “final”也受支持,但拼写不同(“sealed”)。 现在完全支持“override”和“final”的标准拼写和语义。 有关详细信息,请参阅 override 说明符 和 final 说明符

[本文内容]

原子化及更多信息

原子化强比较和交换双向界定数据依赖项排序指定现在已实现的标准库机制。

相关 STL 标头: <atomic><chrono><condition_variable><future><mutex><ratio><scoped_allocator> 和 <thread>

[本文内容]

C99 __func__ 和预处理器规则

C++11 核心语言功能:C99 表列出了两个项的“部分”实现。 对于预定义标识符 __func__,列出“分部”,因为对非标准扩展 __FUNCDNAME____FUNCSIG__ 和 __FUNCTION__ 提供了支持。 有关详细信息,请参阅 预定义的宏。 对于 C99 预处理器规则,列出“分部”,因为支持可变参数宏。 有关详细信息,请参阅 Variadic 宏

[本文内容]

标准库功能

这涵盖核心语言。 至于 C++11 标准库,我们虽没有漂亮的功能比较表,但 Visual Studio 2012 中的 Visual C++ 已实现此功能,但具有两个例外。 首先,当某个库功能依赖于编译器中缺少的功能时,该功能要么是模拟的(例如,make_shared<T>() 的模拟可变参数模板),要么没有实现。 (仅有少数情况现在已经在 Visual Studio 2013 中的 Visual C++ 中完全实现,其中最值得注意的是 <initializer_list>。) C99 已在 Visual Studio 2013 中的 Visual C++ 和提供的 C++ 包装器标头中实现,并且例外情况非常少。 有关更多信息,请参阅 Visual Studio 2013 中的 C99 库支持

下面列出了 Visual Studio 2012 中的 Visual C++ 和 Visual Studio 2013 中的 Visual C++ 中的部分更改:

定位:根据 C++11 的要求,emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() 已在所有包含“任意”数量参数的容器中实现(请参见“模拟的可变参数”部分)。 例如,vector<T> 具有“template <typename... Args> void emplace_back(Args&&... args)”(它在向量的后面从任意数量的任意参数时直接构造元素类型 T,这称为“完全转发”)。 这相对于 push_back(T&&)(将涉及额外的移动构造和析构)效率更高。

可变参数: Visual Studio 2012 中的 Visual C++ 具有用于模拟可变参数模板的方案。 在 Visual Studio 2013 中的 Visual C++ 中,取消了模拟,并完全实现了可变参数。 如果你的代码依赖旧的模拟可变参数行为,则必须修复它。 但是,切换到实际可变参数模板增加了编译次数,并降低了编译器的内存消耗

显式转换运算符:在核心语言中,显式转换运算符是一项常规功能 — 例如,你可以具有 explicit operator MyClass()。 但是,标准库当前仅使用一种形式:explicit operator bool(),这使类成为安全的布尔值可测试的类。 (无格式“operator bool()”是非常危险的。) 过去,Visual C++ 模拟了带有 explicit operator bool() 的 operator pointer-to-member(),这导致各种问题,并且效率有些低下。 现在,完全移除了此“虚拟 bool”工作区。

随机性: uniform_int_distribution 现在是完全公平的,并且在 <algorithm> 中实现了 shuffle(),这样便可以直接接受统一随机数生成器,如 mersenne_twister

防止重载 address-of 运算符:C++98/03 禁止 STL 容器的元素重载其 address-of 运算符。 这是类似 CComPtr 的类完成的操作,因此使 STL 避免此类重载需要类似 CAdapt 的帮助程序类。 开发 Visual Studio 2010 中的 Visual C++ 时,STL 更改使其在更多情况下拒绝重载 address-of 运算符。 C++11 更改了相关要求,使得重载 address-of 运算符可接受。 Visual Studio 2010 中的 C++11 和 Visual C++ 提供帮助程序函数 std::addressof(),此函数可获取对象的真实地址(无论运算符是否重载)。 在发布 Visual Studio 2010 中的 Visual C++ 之前,我们已尝试将“&elem”的匹配项替换为具有一定抵抗性的“std::addressof(elem)”。Visual Studio 2012 中的 Visual C++ 更进一步,这样重载 address-of 运算符的类就能在整个 STL 中使用了。

Visual Studio 2012 中的 Visual C++ 在下列方面超出了 C++11 的范围:

SCARY 迭代器:实现了 SCARY 迭代器,如 N2911“在泛型类中最小化依赖项以获得更快且更小的程序”和 N2980“SCARY 迭代器分配和安装,第一版”中所述,这在 C++11 标准是允许的,但不是必需的。

文件系统:已添加 TR2 建议中的 <filesystem> 标头。 它提供 recursive_directory_iterator 和其他有趣功能。 在 TR2 的工作冻结之前,由于 C++0x 很晚才投入运行且将更改为 C++11,因此从 Boost.Filesystem V2 派生出了 2006 协议。 它稍后改进为 Boost.Filesystem V3,这在 Visual Studio 2015 中实现。

一个主要优化! 现在,我们的所有容器相对于当前的表示形式都具有最小的合适大小。 这指的是容器对象本身,而不是它们指向的内容。 例如,std::vector 包含三个原始指针。 在 Visual Studio 2010 中的 Visual C++ 中,x86 发布模式 std::vector 为 16 字节。 在 Visual Studio 2012 中的 Visual C++ 中,它为 12 字节,这是最小的合适大小。 如果你的程序有 100,000 个向量,则 Visual Studio 2012 中的 Visual C++ 将为你节省 400,000 字节,这很了不起。 减少内存使用率可节省空间和时间。

这是通过避免存储空的分配器和比较运算符来实现的,因为 std::allocator 和 std::less 是无状态的。 (只要自定义分配器/比较运算符是无状态的,也会为它们启用这些优化。 显然,无法避免有状态的分配器/比较运算符的存储,但这种情况极为少见。)

Visual Studio 2013 中的 Visual C++ 实现一些关键的 C++ 14 库功能:

  • “透明运算符函子”less<>greater<>plus<>multiplies<> 等。

  • make_unique<T>(args...) 和 make_unique<T[]>(n)

  • cbegin()/cend()rbegin()/rend() 和 crbegin()/crend() 非成员函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaomu_347/article/details/82563688

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签