最新消息
我们一直忙于在MSVC的编译器和标准库中实现C++ 20的特性,并将后者迁移到 GitHub上的microsoft/STL -事实上,我们一直很忙,没有发布C++工具集 自从 VS 2019 16.0工具集变更日志 . 因此,这里是编译器特性和STL特性/修复程序,这些特性/修复程序在去年已交付生产使用。
作为提醒 /std:c++17 以及/std:c++latest 编译器选项是使用C++ 17和C++ 20的必要条件。
比2019年16.1
新功能(感谢我们的实习生Paolo Torres):
- 实施 P0318R1“展开参考,展开参考衰减” .
- 实施 P0457R2“对于基本字符串/基本字符串视图,以()开头/以()结尾” .
- 实施 P0458R2“用于有序和无序关联容器的contains()” .
- 实施 P0646R1“list/forwardu list remove()/removeu if()/unique()返回大小u type” .
- 实施 P0769R2“左移(),右移()” .
- 实施 P0887R1“类型标识” .
新的语言功能:
- 实施 P0329R4“指定初始化” .
- 实施 P0846R0“不可见的ADL和功能模板” .
正确性修复:
- 修复了VS 2019 16.0中的一个回归问题,在使用具有不相等分配器的分配器扩展移动构造函数时,无序关联容器的桶计数可能会高于预期值。
- 删除了
中不存在的标准极性函数,该函数阻止编译极性 (1.0,2.0)。 - 执行了 LWG-3025型 ,它修复了map、multimap、unorderedu map和unorderedu multimap的演绎指南,以启用从例如{pair{1,2}、{3,4}的演绎。
- 执行了 LWG-3012型 ,它要求std::atomic的参数可以是copy-constructible、move-constructible、copy-assignable和move-assignable,以及前面的可复制需求。
- 删除了非标准std::identity,为新标准std::identity扫清了道路(多亏了我们的实习生保罗·托雷斯
- 重写
以提高吞吐量和codegen(特别是对于调试编译),并在Clang下修复了atomic 的constexpr构造中的一个bug。
性能和吞吐量修复:
- 删除了几个以前用于实现STL特性的内部“便利”函数,这些功能与每个函数开销选项(如/RTC1和/JMC)的调试codegen交互较差。
- 将complex改为调用std::hypot而不是一个稍微不同的库实现,以使用Vivian An An在/fp:fast下的优化器中对hypot进行的编译器优化。
- 修复了vector
::reference的swap函数成为隐藏的朋友,改进了在交换不相关的不可交换类型时的编译器诊断。 - 修复了关联容器在内部使用启用迭代器调试的迭代器的几个地方。
- 通过去除自递归和尝试区域,优化了无序关联容器的再散列操作。
- 通过尽可能用可变模板定义类模板,并大大简化makeu signedu t和makeu unsignedu t,提高了
的吞吐量。
其他改进:
- 该标准要求实现支持一组特定的方面专门化。MSVC的STL允许使用非标准的facet专门化,通常会产生不希望的结果。在这个版本中,我们实现了一个off-by-default模式来强制只使用标准的facet专门化,为非标准用法发出一个静态的u断言。使用/Du ENFORCEu FACETu SPECIALIZATIONS=1编译将请求此模式。
比2019年16.2
新功能:
- 实施 P0020R6原子
、原子 . 这些在我们所有支持的平台上都是免锁的。和原子 - 在一个新的宏&u CONTAINER&u DEBUG&u LEVEL下实现了相对快速的布局保留范围检查,它补充了ITERATOR&u DEBUG&u LEVEL。我们希望这将替换_ITERATOR_DEBUG_LEVEL==1的任何剩余用例。
- 实施 P0428R6“字符库支持” 对于非铿锵(直到铿锵8.0.1,铿锵才知道如何在MS ABI中破坏char8 )。
- 实施 P0754R2“<版本>” .
- 实施 P0463R1“endian” . (多亏了我们的实习生保罗·托雷斯
- 实施 P0600R1“[[nodiscard]]用于STL” . ((保罗)
- 实施 P0653R2“收件人地址()” . ((保罗)
- 实施 P0771R1“std::函数的Move构造函数没有异常” . ((保罗)
- 实现了更多的浮点
机制。固定/科学精度到_chars()现在可用,由Ulf Adams发明和实现的Ryu Printf算法提供支持。
新的语言功能:
- 实施 P0409R2“允许lambda捕获[=,this]” .
- 实施 P0428R2“通用lambda的熟悉模板语法” .
- 实施 P0482R6“char8u t:UTF-8字符和字符串的类型” .
- 实施 P0624R2“默认可构造和可分配的无状态lambda” .
- 实施 P0780R2“允许lambda init capture中的包扩展” .
- 实施 P0806R2“不赞成通过[=]隐式捕获此内容” .
- 实施 P1120R0“用于<=>和其他比较运算符的一致性改进” .
- 实施 P1185R2“<=>!==” .
正确性修复:
- 修复了基本的u字符串,为复制分配提供了强大的异常安全保证,并在u容器u复制u分配分配器上使用了不相等的传播u。
- 修复了_ITERATOR_DEBUG_LEVEL==1,不再对基于节点的容器forward_list、list、set、map、multiset、multimap、unordered_set、unordered_map、unordered_multiset或unordered_multimap进行迭代器所有权断言。发现这些断言在存在拼接、合并或使用C++ 17 NoDyHAAD的情况下拒绝有效程序的条件。
- 固定列表的remove if算法允许容器自引用作为标准允许但不要求的扩展。
- 修复了前向u列表::在处理双排他范围后擦除u,以避免容器损坏。libcxx的测试套件发现了此处理中的边缘案例。
- 修复了multiset和multimap,可以使用提供的提示控制等效元素范围内的相对元素插入顺序。
- 修复了将Win32错误代码erroru INVALIDu NAME解释为“找不到文件”错误而不是status()中的致命I/O错误的问题。
- 修复了当exceptions()设置了eofbit时,遇到文件结尾时不设置badbit的istream::sentry。
- 修复了istream::sync()允许streambufs抛出pubsync()。
- 针对新的C++ 20关键字在
中的宏化进行了防范。 - 修复了mbctype.h和
之间的冲突。mbctype.h宏化了u M2,因此 现在避免将其用作标识符。 - 修复了deque迭代器孤立,这是导致崩溃在调试模式。
- 修正了从u chars()错误影响某些角落案件与次正常。
- 已从溢出/下溢的u chars()行为更改为与strtod()行为一致(请注意,这是由 LWG-3081型 提出了不同的解决方案。)
性能和吞吐量修复:
- 如果constexpr应用到更多的地方,包括
、 ,以及用于实现deque、string和vector的分配器范围算法。 - 修复了基于树的关联容器set、map、multiset和multimap,以便始终使用提示参数(如果提供)。
- 修复了基于树的关联容器set、map、multiset和multimap的代码大小减少的问题,因为相同的二进制搜索操作现在同时支持插入操作(如insert或emplace)和普通查找函数(如lower u bound或find)。以前,这是以优化器无法合并的方式复制的。
- 从
中删除了更多的try区域。 - 优化的关联容器映射、集合、无序的集合映射和无序的集合放置,以避免在直接向容器传递密钥实例时插入重复密钥时分配节点。
- 修复了前向u列表::调整大小以避免重复遍历前向u列表来计算大小。
- 减少了前向u列表::在迭代器调试成本之后插入u。
- 在
中,通过Ryu Printf优化,将最短长度固定到u chars()更快。
其他改进:
- 将STL的必需版本Clang增加到8.0.0。
比2019年16.3
新功能:
- 实施 P0898R3“标准库概念” ,添加
标题。 - 实施 P0487R1“固定运算符>>(基本u i流和,图表*)” .
- 实施 P0616R0“在
中使用move()” . - 实施 P0758R1“不可转换” .
- 实施 P0919R3“无序容器的异构查找” .
- 添加[[nodiscard]]属性到带有u Check u return u SAL注释的函数中,由于存在冗余,我们在早期的[[nodiscard]]工作中跳过了这些属性。
- 当编译器支持Clang和智能编译器所做的属性时,在C++ 14模式中激活STL[[ NODeBARDAR] ]属性。MSVC支持[V[NoDeDARD] ]在VS 2019模式下的C++ 14模式中。(我们提到了我们对[[NoDeDaRe])的喜爱吗?
- 添加了一个新的标题,使开发工具的人员能够轻松地确保他们使用所有标准库标题,并且不需要随着时间的推移编辑硬编码列表。
新的语言功能:
- 实施 P0734R0“概念的C++扩展” .
- 实施 P0857R0“约束中的功能差距” .
- 实施 P1084R2“今日退货类型要求不足” .
正确性修复:
- 实现了isu-trivial/isu-trivialu v类型特性,即isu可构造性和isu-trivialu可复制性,以解决MSVC和Clang的isu-trivial内部函数中的错误。
- 检测到更多的非编译器工具(Qt的MOC和Windows的MIDL,除了预先存在的Windows资源编译器的检测),有时会处理C++头文件,并使用预处理器对STL头的内容进行隐藏,以避免在STL使用新的语言构造时发生破坏,而这些新的语言构造是这些工具无法理解的(这是一次尽力而为的尝试;理想情况下,人们一开始不会将这些工具指向STL头。)
- 在适配容器上根据相应的操作实现堆栈和队列的比较操作,而不是在适配容器上根据==和<实现所有比较操作。
- 修复了pmr::monotonicu resource::release中的一个错误,该错误导致在从monotonicu资源进行后续分配时使用释放的内存。
- STL现在只对容器用户提供的类型使用allocator::construct,因此默认初始化而不是值初始化的分配器不再破坏容器。
- STL现在不会在堆栈上创建临时值,而不经过容器的分配器构造。
- 针对客户请求的更多默认关闭警告进行防御,如C4582、C4583、C4587、C4588和C4800。
- currentu exception()和currentu exceptions()现在在终止处理程序中返回正确的值。
- 实施 LWG-2996型 “缺少共享u ptr操作的rvalue重载”。
- 实施 LWG-3038型 “多态分配程序::分配不应允许整数溢出来创建漏洞”。
- 实施 LWG-3074型 “valarray的非成员函数应仅从valarray推断”。
- 实施 LWG-3130型 “[input.output]需要许多addressof”。
- 实施 LWG-3131型 “万物皆有”。
- 简化的是空的,积分的,浮点的。以前,我们明确地在C++ 14模式中专门化了非内联变量模板,这在技术上被标准禁止,并且给Clang带来了头痛。
性能和吞吐量修复:
- 使用uu is u same内在函数在Clang上实现is u same/is u same u v类型特征。
- 在执行批量操作时,基于节点的容器将更频繁地重用节点,而不是取消分配和重新分配所有内容。例如,给定一个包含C元素的列表L,L.assign(N,T)现在只释放未使用的C–N元素或只分配新需要的N–C元素,而不是先释放所有C元素,然后再分配所有N元素。
其他改进:
-
不再包括 。 -
现在发出一个警告/错误:“提供std::experimental::filesystem的 头已被Microsoft弃用,将被删除。它被C++ 17文件系统>标题所取代,提供STD::FielSoS.您可以定义u SILENCEu EXPERIMENTALu FILESYSTEMu DEPRECATIONu WARNING来确认您已收到此警告。“ - 删除了非标准的
、 和 头。 - 删除了STL中不必要的“inline”关键字。
- 提高了STL/墙壁的清洁度。请注意,这是由跟踪的正在进行的工作 微软/STL#186 .
- 消除了STL头中的所有C类型转换。
- 加强了各种功能的例外。
比2019年16.4
新功能:
- 将STL的必需版本Clang增加到8.0.1。这显著地启用了对Clang的STL char8u t支持,Clang以前的版本不知道如何在msabi中破坏char8u t。
- 实施 P1754R1“将概念重命名为标准u案例” .
- 实施部分 P0896R4“<范围>” :
- 迭代器特性的更改
- 迭代器和范围概念的添加
- 范围::iteru移动和范围::iteru交换自定义点
- 范围访问自定义点(ranges::begin和ranges::end、ranges::size、ranges::empty、ranges::data和ranges::cdata的normal/const/reverse/const reverse变体)
- 关联的类型别名:ranges::iteratoru t、ranges::sentinelu t、ranges::rangeu valueu t、ranges::rangeu referenceu t、ranges::rangeu differenceu t和ranges::rangeu rvalueu referenceu t
- 对数组、基本字符串、基本字符串视图、valarray和vector进行必要的修改,以对连续范围概念进行建模
- 在MSVC中用C++ 14模式激活STL[NODDEARDAR]属性。
- 实现了一般精度ToA字符(),完成C++ 17 CARCONV>。
新的语言功能:
- 实施 P0892R2“显式(布尔)” .
- 实施 P1091R3“将结构化绑定扩展为更像变量声明” .
- 实施 P1099R5“使用枚举” .
- 实施 P1186R3“您实际何时使用<=>?” .
- 实施 P1630R1“宇宙飞船需要调整” .
正确性修复:
- 在
中显式指定了一些枚举类型的底层类型,这些类型使用逐位操作来避免存储不可表示的值(这是形式上未定义的行为,如Clang的UBSAN所述)。 - 实施 LWG-3196“如果T是数组,则std::optional
格式错误” (它的格式已经不正确,但现在有一个友好的静态消息)。通过简化optional与T比较的元编程,以及在optional::swap中使用“if constexpr”而不是标记分派,吞吐量略有提高。 - 应用 用户提供的解决方案 在公共参考中查找IntelliSense错误。
- std::filesystem::directoryu条目不再声明不存在的文件是常规文件。
- std::filesystem::directoryu iterator(“”)不再在当前的u path()上迭代。
- std::filesystem::recursive_directory_iterator在传递包含嵌入null的路径时不再触发无限循环。
- 修复了在list::splice期间迭代器调试支持中容器大小可能被错误更新的边缘情况。
- 改进了NaN的浮点
处理。
性能和吞吐量修复:
- 通过
减少包含的内容量。 - 改进了list和forward-u-list的成员算法,不需要距离/提前呼叫,因为距离/提前呼叫是非随机访问范围,效率低下。
- 部分实施 LWG-2550“无序容器的clear()应为O(元素数)” 就我们目前的ABI所允许的范围而言,这将加快无序容器的速度,其中包含大量的桶,但元素很少。我们只能在哈希函数不例外的情况下这样做,因为在不遍历每个bucket时删除元素需要对哈希函数求值。
- 在几个容器函数上增强了noexcept。
- 原子<8字节>现在在x86而不是cmpxchg8b上通过普通加载实现。
- 通过对MSVC和IntelliSense编译器使用条件显式in-pair/tuple/optional,提高了吞吐量。
其他改进:
- 移除了在定义为0的C++数学中的“逃逸孵化”宏,它在C++中禁止了C++ 17数学特殊函数的定义。
比2019年16.5
请看 https://github.com/microsoft/STL/wiki/Changelog 有关所有未来VisualStudio版本中STL的发行说明。
新的语言功能:
- 实施 P0306R4“逗号省略和删除” .
- 实施 P1042R1“uu VAu OPTu措辞澄清” .
- 实施 P0595R2“标准::是否为常数u求值()” .
- 实施 P0614R1“带初始值设定项的语句基于范围” .
- 实施 P0683R1“位字段的默认成员初始值设定项” .
- 实施 P1002R1“在constexpr函数中尝试catch块” .
- 实施 P1161R3“不赞成在订阅表达式中使用逗号运算符” .
- 实施 P1301R4“[[nodiscard(“应该有原因”)]]” .
- 实施 P1946R0“允许按值进行默认比较” .
- 实施 P1703R1“识别头单元导入需要完全预处理” .
比2019年16.6
请看 https://github.com/microsoft/STL/wiki/Changelog 有关所有未来VisualStudio版本中STL的发行说明。
新的语言特点和国家机构评论决议:
- 实施 P0692R1“专业化访问检查” .
- 实施 P0732R2“非类型模板参数中的类类型” .
- 实施 P1139R2“解决与ISO 10646相关的措辞问题” .
- 实施 P1907R1“与非类型模板参数不一致” .
- 实施 P0479R5“可能和不可能属性” .
- 执行US 053“强制退货类型为退货作废,退货值为作废”
- 已实施US 065“从P0664R8应用协同程序问题24”
更多信息
对于VisualStudio更改(超出C++工具集)和下载链接,请参见 VS发行说明 和 VS预览发行说明 . 你可以通过 开发者社区 ,还可以通过 microsoft/STL GitHub问题 .