VS 2015更新1 现在可用 ,它包含许多STL修复。 (这是自2010年SP1以来,我们首次在主要版本之外发布STL修复程序。 2015年RTM中没有严重的问题–我们只是想更快地为您提供修复,我们的内部流程使这变得更容易。) 像往常一样,我写了一个详尽的变更日志,比如 第1部分 和 第2部分 2015年RTM的修复。 请注意,虽然update1包含许多编译器/IDE/etc.改进(包括对表达式SFINAE的部分支持),但这里没有提到这些改进——我个人无法跟踪所有改进!
首先,Steve Wishnousky最近加入了VC库团队,他在Update 1中得到了一些修复:
*unordered_meow::max_bucket_count()返回的值不正确(VSO#144294)/ 连接#1764567 ). 现在它是正确的。
*我们的内部助手函数_Allocate()和_Deallocate()被不必要地模板化,产生了比必要的对象文件更大的文件(VSO#130290)。 现在它们已经去模板化了,应该会稍微收缩对象文件。
此外,Hong Hong还修复了
*<未来>不尊重Š有Š例外=0(TFSŠ1127004)/ 接#1137364 ). 虽然这是目前未记录,未经测试,不支持的微软,我们决定解决这个问题无论如何。
*
接下来,我修复了几个bug:
*给定enable_shared_from_this
*分配器错误地假设UserAlloc::construct()/destroy()返回void(当它们存在时),触发了非void返回类型的编译器错误(TFS#1184701)。 现在我们正确地接受(并忽略)非void返回类型。
*在2015年RTM的tupleu size/tupleu元素中,我试图通过对非tuple-ish事物的静态断言来提供帮助。 不幸的是,这阻止了SFINAE,所以它是不符合的(TFS#1192603,TFS#1205400)/ 接#1600812 ). 现在我们遵循标准。
*标准要求rethrowŠexception()标记为[[noreturn]],但我们的没有,这可能会在编译时中断代码(VSOŠ125155)/ 连接#1657472 ). 除了修复这个问题之外,我还检查了其他丢失的事件(没有任何),并且我将STL中的每一个declspec(noreturn)改为[[noreturn]]。 (它们是同义词,所以这只是在可能的情况下尝试使用标准机械。 请注意,CRT继续使用u declspec。)
*在2015年RTM的memu fn()中,我试图通过使用调用约定处理一个特别模糊的场景来变得聪明。 这对函数的签名几乎没有明显的影响,用户不可避免地注意到了这一点(VSO#134162)。 我去掉了聪明,所以memu fn()完全遵循标准。
*原子
*除了
技术细节:Clang3.7附带了几个选项,-fms扩展和-fms兼容性。 -fms扩展控制非标准特性,如uu declspec(dllexport),STL需要它来完成工作。 -fms兼容性控制“bug兼容性”(即让Clang模仿C1XX bug),但当我和David在CppCon 2015见面时,我们意识到有两种bug兼容性:影响ABI的bug(例如布局)和不影响ABI的bug(例如接受无效)。 因此,对Clang的3.7后主干(并移植到Clang/C2版本)进行了一些更改。 现在,针对Windows时,始终启用与ABI相关的bug兼容性,因为这是与c1x/C2二进制文件链接兼容所必需的。 ABI无关bug兼容性由-fms兼容性控制。 我们的STL头文件(和测试)现在可以与-fno-ms一起工作-兼容性,最严格的一致性级别。 (有一个小的例外:
*当我在附近的时候,我还修复了STL的头文件以使用/Za,并添加了全面的测试覆盖率。 /Za是c1x启用额外一致性的选项,但它也会在很少使用的代码路径中启用额外的编译器错误,因此我们不鼓励使用它。 (几年前,我停止了用/Za测试STL,因为它打破了vector
请注意,/Za仍然受到编译器错误的影响,该错误会阻止您将它与STL一起使用(通常)。 VSO#122298号/ 接#1331482 “declspec(selectany)constexpr不与/Za一起工作”在多个翻译单元拖入
*数值u限制
*
*通过避免不必要的拷贝,shared-u-ptr的原子操作(怪异的自由函数,而不是普通的refcount操作)的性能得到了改进。
*正如Clang/libc++的测试套件(TFS#917456,TFS#917467)发现的那样,位集<0>的成员函数在运行时表现不正常。 现在它们的行为是正确的,尽管bitset<0>仍然是最无用的东西。
最后,尽管我通常不列出编译器修复,即使它们影响STL(例如
*Tanveer Gani修复了VSOෘ103444“constexpr构造函数正在发射动态初始值设定项”。 这影响了新constexprized的STL,最重要的是std::once u标志,它现在根据标准的要求进行静态初始化。 请注意,此修复程序有一些不影响STL的限制(例如,使用virtuals仍然可以防止静态初始化),并且有一个可以禁用的虚假警告-请参阅Tanveer的回答 这个问题 更多信息。
这就是STL的update1changelog的结尾。 史蒂夫·维什努斯基( @史蒂夫维什努斯基 ),我们的另一个新员工比利·奥尼尔( @马尔瓦米尼贡 ),我正在为更新2做更多的修改-我们已经检查了几十个补丁和9个特性! (这将是自2008年SP1以来,我们首次在主要版本之外发布STL特性。)
斯蒂芬T。拉瓦维( @斯蒂芬特拉瓦维 )
高级开发人员——Visual C++库