VS “15” Preview 4中C++14/17特性和对STL的修复

[原文发表地址] VS “15” Preview 4中C++14/17特性和对STL的修复

[原文发表时间] 08/24/2016

Visual Studio “15”Preview 4现在可以使用了,这是新的安装包。(VS“15”是IDE的版本号,不是年份。它是继VS2015之后的下一个主要版本,VS2015就是IDE 14。VS针对年份,IDE版本和C++编译器版本都有不同的编号。)

 

所有在VS2015 Update 3中的特性和修复 (包括为std::abs(),std::min(),std::max()和std::pow()所做的优化改进,这些我们之前忘了说)都可以在VS“15”Preview 4上使用。此外,我们还有一些新东西要宣布。以前,新的主IDE版本会包含新的主编译器版本和不兼容二进制的STL(这允许我们为了准确性和性能而去改造我们的数据结构表征)。现在,我们已经将特性添加到了编译器上,并且在VS2015 RTM以来,STL一直处于高度兼容的方式,我们会继续将这些延伸到新的主IDE版本中。具体来说,VS2015和VS“15”将会拥有相同的主编译器版本(19)和兼容二进制的STL, 并且这个兼容的编译器和STL将会在VS“15”的整个生命周期中保持可用。这意味着STL的动态链接文件将继续命名为msvcp140.dll。(在将来的某一刻,我们期望再次有一个编译器20版和不兼容二进制的STL。)

 

注意,我们可以确保二进制兼容性,但不保证源代码兼容性。虽然版本开关/std:c++14(默认选项)常常会保持源代码兼容性,它通常会为了修复bug或者解决问题而去请求改变源代码。虽然我们尝试去避免不必要的源代码重大改变,但在有必要的时候我们也会在MSDN上说明一下,正如我们在VS2015 Updates上做的一样。请注意/std:c++latest将会频繁的发生重大改变,但我们也会将这个改变记录下来(尤其是在STL中,随着我们根据最新的工作文档来更新我们的实施,这样可能会出现一种我们没有立刻意识到的意外的方式去破坏源代码,因此在这里警示一下)。

 

很明显,这是对于我们的程序员用户来说是一个好事情。尽管主编译器版本仍然是19,但我们还是添加了新的编译器和STL特性。((_MSC_FULL_VER将会增加,允许已更新的编译器被检测到)。并且STL的二进制兼容性意味着第三方库可以被构建一次并且被用于VS2015和VS“15”。(然而,使用最新的可用版本的编译器编译仍然是最好的,因为它会给你最好的准确性和性能。)现在,以下是我们添加的东西:

 

编译器特性

C++14特性NSDMIs for aggregates已经被Vinny Romano在没有任何附加条件的情况下实现了。

C++17特性[[fallthrough]] attribute 已经被Shuo Chang实施在/std:c++latest之下了。

 

STL特性

C++17特性<algorithm> sample()已经被实施在/std:c++latest之下了。

C++17特性is_callable已经被实施在/std:c++latest之下了。(is_nothrow_callable的实现在Preview 4中被一个编译器bug中断了, 这个bug将会在下一个build中被修复。)

 

LWG问题

下列C++14类库问题的决议已经被无条件的实施了:

  • LWG 2135 在condition_variable::wait() 关于异常抛出的不明确规定
  • LWG 2203 scoped_allocator_adaptor 使用错误的参数类型来进行分段构造
  • LWG 2210 对allocator-aware 容器而言遗漏了allocator-extended 构造函数

下列C++17类库问题的决议已经被无条件实施了:

  • LWG 2063 关于字符串移除分配自相矛盾的规定
  • LWG 2219 调用一个指向reference_wrapper 成员的指针作为对象表达式
  • LWG 2439 unique_copy()不能读取其输出信息
  • LWG 2476 scoped_allocator_adaptor 不可被分配
  • LWG 2566 关于容器适配器的第一个模板参数的规定
  • LWG 2576 istream_iterator 和ostream_iterator 应该用std::addressof
  • LWG 2577 {shared,unique}_lock 应该使用std::addressof
  • LWG 2579 关于basic_string assignment vs. basic_string::assign不一致的分配器
  • LWG 2583 关于basic_string(str, pos)无法使用分配器
  • LWG 2586 在scoped_allocator_adaptor::construct()使用的值范围不正确
  • LWG 2684 priority_queue没有comparator typedef
  • LWG 2716 关于 shuffle and sample 不允左值为URNGs

 

STL修复

改正_ITERATOR_DEBUG_LEVEL=2断言。现在他们将总是只发出一个断言对话框,并不能被忽略。(在以前,有一些但不是全部的断言会发出两个对话框,并且有一些但不是全部的是可以被忽略的。)

 

进一步提高对fancy 指针的支持。更多的STL允许类似指针的类类型。(Fancy指针,由std::pointer_traits调用,这是很先进和罕见的。)

 

对于包含用non-trivial析构函数的list/forward_list上调用uninitialized_copy()时会引起编译器错误,目前我们已经修复这个regression 问题(VSO#233820/Connect#2846868)。

 

修复了所有已知的scoped_allocator bug:VSO#129349 “<scoped_allocator>: scoped_allocator 尝试调用默认的construct allocators”, VSO#146338 “<scoped_allocator>: error C2512: no appropriate default constructor available”, and VSO#224478 “<scoped_allocator>: construction is using true placement new, not OUTERMOST_ALLOC_TRAITS::construct”。

 

修复了<filesystem>中setlocale()引起内存崩溃的问题。

 

修复了<regex>中match_prev_avail,match_not_bol和match_not_eol的不准确匹配的问题(VSO#225160/Connect#2745913,VSO#226914)。

 

解决了CRT在std::async()线程关闭前先停止(VSO#225699)。

 

Billy Robert O’Neal III – @MalwareMinigunbion@microsoft.com

Casey Carter – @CoderCaseycacarter@microsoft.com

Stephan T. Lavavej – @StephanTLavavejstl@microsoft.com

Steve Wishnousky – stwish@microsoft.com