编辑器对C++ 11 特性的支持情况

13 篇文章 0 订阅
此文章由人工翻译。 将光标移到文章的句子上,以查看原文。  更多信息。
译文
原文

支持 C++11/14/17 功能(现代 C++)

Visual Studio 2015
 

本文描述了 Visual C++ 中的 C++11/14/17 功能。

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 核心语言功能

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

尾部的返回类型

Lambda v0.9v1.0v1.1

v1.0

1.1 版

1.1 版

decltype v1.0v1.1

v1.0

1.1** 版

1.1 版

右尖括号

函数模板的默认模板参数

表达式 SFINAE

别名模板

Extern 模板

nullptr

强类型的枚举

Partial

前向声明枚举

特性

constexpr

对齐

TR1

Partial

部分

委托构造函数

继承构造函数

显式转换运算符

char16_t/char32_t

Unicode 字符串文本

原始字符串文本

文本中的通用字符名

用户定义的文本

标准布局和普通类型

默认函数和已删除的函数

是*

扩展的友元声明

扩展的 sizeof

内联命名空间

无限制的联合

作为模板参数的本地和未命名类型

基于范围的 for 循环

override 和 final v0.8v0.9v1.0

Partial

最低 GC 支持

noexcept

[本文内容]

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

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

Visual Studio 2015

改写的序列点

不可用

不可用

不可用

原子化

强比较和交换

双向界定

内存模型

不可用

不可用

不可用

数据依赖项排序

数据依赖项排序:函数批注

exception_ptr

quick_exit

信号处理程序中的原子化

线程本地存储

Partial

部分

部分

神奇的静态对象

[本文内容]

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

Visual Studio 2010

Visual Studio 2012

Visual Studio 2013

Visual Studio 2015

__func__

Partial

部分

部分

C99 预处理器

Partial

部分

部分

<?>

long long

扩展的整数类型

不可用

不可用

不可用

不适用

[本文内容]

功能

Visual Studio 2013

Visual Studio 2015

上下文转换的已调整 workding

二进制文本

No

auto 和 decltype(auto) 返回类型

No

init-capture

No

泛型 lambda

No

变量模板

No

No

扩展的 constexpr

No

No

聚合的 NSDMI

No

No

避免/合成分配

No

No

[已弃用] 特性

No

No

大小经过调整的分配

No

数字分隔符

No

功能

Visual Studio 2013

Visual Studio 2015

针对自动使用大括号内的初始值设定项列表的新建规则

No

No

简要静态断言

No

No

模板-参数模板的类型名称

No

No

删除三字符组

嵌套的命名空间定义

No

No

N4259 std::uncaught_exceptions()

No

No

N4261 修复限定转换

No

No

N4266 命名空间和枚举器的特性

No

No

N4267 u8 字符文本

No

No

N4268 允许更多非类型模板参数

No

No

N4295 Fold 折叠表达式

No

No

等待/继续

No

System_CAPS_note注意

以下描述中的版本标识符(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 中实现的。

[本文内容]

在 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-expression 的 lambda-capture 的闭包类型使用一个公共的非虚拟、非显式常量转换函数指向一个具有与闭包类型的函数调用运算符相同的参数和返回类型的函数。此转换函数返回的值应为一个函数的地址,调用该函数时,其效果和调用结束类型的函数调用运算符相同。”(Visual Studio 2012 中的 Visual C++ 实现的效果甚至更好,因为它使无状态的 lambda 可转换为具有任意调用约定的函数指针。当你在使用期待像 __stdcall 函数指针这类对象的 API 时,这点很重要。)

[本文内容]

在 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_storageVisual 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_note注意

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

[本文内容]

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

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

[本文内容]

这经历了短暂而复杂的发展。最初,在 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 说明符

[本文内容]

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 现在是完全公平的,并且在 shuffle() 中实现了 <algorithm>,这样便可以直接接受统一随机数生成器,如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 标准是允许的,但不是必需的。

文件系统:已添加 <filesystem>TR2 建议中的 标头。它提供 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() 非成员函数。

出处: https://msdn.microsoft.com/zh-cn/library/hh567368.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: NyiDE编辑器是一款基于Web平台的在线代码编辑器,可以用于编写和编辑各种编程语言的代码。以下是使用NyiDE编辑器的步骤: 1. 打开浏览器,进入NyiDE编辑器的官方网站。可以在搜索引擎中输入"NyiDE编辑器"来找到官方网站。 2. 在网站上找到NyiDE的编辑器界面,并点击进入。 3. 当进入编辑器界面后,可以看到界面的主要区域分为代码编辑区和结果展示区。 4. 在代码编辑区,可以输入自己的代码。根据需要选择合适的编程语言,可以是C、C++、Java、Python、JavaScript等等。 5. 在输入代码后,可以点击界面上的运行按钮来执行代码。执行结果会在结果展示区中显示。 6. 在编辑器界面中,还可以进行一些其他操作,比如保存代码、下载代码文件、设置代码的主题等等。 需要注意的是,NyiDE编辑器是在线编辑器,代码是在网页上运行的,所以需要一个稳定的网络连接。此外,NyiDE编辑器提供的功能相对简单,对于一些高级的开发和调试任务可能不够强大。但是对于一些简单的代码编写和调试,NyiDE编辑器是一个方便快捷的工具。 ### 回答2: Nyide编辑器是一款功能强大且易于使用的代码编辑器。使用Nyide编辑器,您可以编辑各种类型的代码文件,如HTML、CSS、JavaScript等。 要使用Nyide编辑器,首先需要将其安装到您的计算机上。您可以从官方网站或其他可靠的软件下载网站下载Nyide编辑器的安装程序。安装程序提供了一系列的安装步骤,按照提示操作即可完成安装。 安装完成后,您可以打开Nyide编辑器。在主界面上,您可以看到一个包含菜单栏、工具栏和编辑区域的窗口。菜单栏提供了各种功能和选项,可以让您进行文件的打开、保存、编辑和运行等操作。工具栏则包含了常用的工具和快捷方式,可以更方便地访问一些常用功能。 在编辑区域内,您可以开始编写代码。Nyide编辑器提供了丰富的代码编辑功能,如代码高亮、自动缩进、自动完成等,可以帮助您提高编码效率和准确性。您可以输入代码、调整代码格式、添加注释等。 另外,Nyide编辑器还提供了代码运行功能,您可以直接在编辑器中运行您编写的代码并查看运行结果。只需点击工具栏中的“运行”按钮或使用快捷键即可。此外,您还可以选择不同的运行环境或浏览器进行测试。 在使用Nyide编辑器时,您可以根据自己的需求进行个性化设置。例如,您可以更改编辑器的主题、字体、代码展示方式等。此外,Nyide编辑器支持插件扩展,您可以根据需要安装和使用各种插件,来增强编辑器的功能和效果。 总而言之,Nyide编辑器是一款简单易用但功能强大的代码编辑器,在您的编码过程中,它可以提供各种便捷和实用的功能,帮助您更高效地编辑和运行代码。 ### 回答3: 为了回答你的问题,首先需要明确“nyide”是指哪个编辑器。假设你指的是NyiDE,它是一款基于Web的在线Python编辑器。下面是使用NyiDE编辑器的基本步骤: 1. 打开浏览器,进入NyiDE的官方网站(https://www.nyide.com/)。 2. 在网页上方的编辑器区域,输入你的Python代码。你可以编辑多个文件,以及创建和导入模块。 3. 在左侧的文件资源管理器中,你可以查看并选择已创建的文件。 4. 编写代码后,可以点击运行按钮(位于编辑器上方的工具栏)来运行你的代码。你也可以使用快捷键Ctrl+Enter。 5. 运行结果将显示在右侧的输出窗口中。你可以查看程序的输出结果和错误信息。 6. NyiDE还提供了调试功能,你可以在编辑器中设置断点,并逐行调试你的代码。 7. 在编辑器的上方菜单栏中,你可以选择不同的主题和字体大小,以及其他个性化设置。 8. 如果你想保存你的代码,可以点击保存按钮(位于工具栏中的磁盘图标),将代码保存到本地或云端。 9. 另外,NyiDE还支持团队协作和项目管理的功能,你可以通过登录账号来享受这些高级功能。 需要注意的是,以上步骤仅涵盖了NyiDE的基本使用方法,实际上还有许多高级功能和特性可以进一步探索和学习。你可以在NyiDE的官方文档中查找更多详细的使用指南和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值