{"id":6871,"date":"2015-07-14T17:38:09","date_gmt":"2015-07-14T17:38:09","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vcblog\/2015\/07\/14\/stl-fixes-in-vs-2015-part-2\/"},"modified":"2019-02-18T18:05:01","modified_gmt":"2019-02-18T18:05:01","slug":"stl-fixes-in-vs-2015-part-2","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/stl-fixes-in-vs-2015-part-2\/","title":{"rendered":"STL Fixes In VS 2015, Part 2"},"content":{"rendered":"<p><span style=\"font-family:Verdana;font-size:12pt\">In addition to implementing <a href=\"http:\/\/blogs.msdn.com\/b\/vcblog\/archive\/2015\/06\/19\/c-11-14-17-features-in-vs-2015-rtm.aspx\"><span style=\"color:blue;text-decoration:underline\">a whole bunch of features<\/span><\/a> in VS 2015&#8217;s C++ Standard Library, we&#8217;ve also fixed a whole bunch of bugs.&nbsp; A year ago, I listed the <a href=\"http:\/\/blogs.msdn.com\/b\/vcblog\/archive\/2014\/06\/06\/c-14-stl-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1.aspx\"><span style=\"color:blue;text-decoration:underline\">STL fixes in VS 2015 CTP1<\/span><\/a>.&nbsp; Now, it&#8217;s time to list the STL fixes between CTP1 and RTM.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>&lt;functional&gt; Overhaul  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">We originally shipped bind()\/function\/mem_fn()\/reference_wrapper\/etc. as part of TR1 in VS 2008 SP1.&nbsp; As TR1 evolved into C++0x and then into C++11, we updated our implementation to use rvalue references, decltype, and variadic templates.&nbsp; While this mostly worked, the TR1-era machinery was extremely complicated, and it accumulated a large number of bugs over the years.&nbsp; We don&#8217;t want the Standard Library to &#8220;mostly work&#8221; &#8211; we want crystalline perfection.&nbsp; So, I rewrote &lt;functional&gt; almost entirely from scratch, keeping only C++03&#8217;s stuff and std::function&#8217;s skeleton.&nbsp; This significantly reduced the size of the STL&#8217;s source code (by 24 KB, 935 editor lines).&nbsp; Except for one limitation (Expression SFINAE in function\/result_of), overhauling &lt;functional&gt; fixed all known bugs:  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* In certain scenarios, bind() wouldn&#8217;t compile with a function object inheriting operator()() from a base class (DevDiv#617421\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/779061\"><span style=\"color:blue;text-decoration:underline\">Connect#779061<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* bind() wasn&#8217;t perfectly forwarding unbound arguments passed through placeholders like _1 (DevDiv#343411\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/717188\"><span style=\"color:blue;text-decoration:underline\">Connect#717188<\/span><\/a>, DevDiv#410033\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/737872\"><span style=\"color:blue;text-decoration:underline\">Connect#737872<\/span><\/a>, DevDiv#862588\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/814028\"><span style=\"color:blue;text-decoration:underline\">Connect#814028<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* bind()&#8217;s function call operator wasn&#8217;t const-overloaded (DevDiv#535246\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/773565\"><span style=\"color:blue;text-decoration:underline\">Connect#773565<\/span><\/a>, DevDiv#1034816\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/981289\"><span style=\"color:blue;text-decoration:underline\">Connect#981289<\/span><\/a>).&nbsp; My original fix accidentally tried to use Expression SFINAE, but I was able to fix that for RTM (DevDiv#1160769, DevDiv#1165732\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1298009\"><span style=\"color:blue;text-decoration:underline\">Connect#1298009<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* bind()\/function\/etc. had difficulty with PMFs\/PMDs (pointers to member functions\/data).&nbsp; The Standard specifies that bind()\/function\/etc. call an imaginary function named INVOKE(), which does magical things (<a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/n4527.pdf\"><span style=\"color:blue;text-decoration:underline\">N4527<\/span><\/a> 20.9.2 [func.require]\/1).&nbsp; INVOKE() knows that function objects, PMFs, and PMDs all require different syntax, and it knows how to use PMFs\/PMDs with references\/raw pointers\/smart pointers to base\/derived objects.&nbsp; In C++17, this is a real function invoke() that you can call directly.&nbsp; My &lt;functional&gt; overhaul implemented invoke(), following the Standard exactly, and therefore fixed all of the bugs with PMFs\/PMDs (DevDiv#294051\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/694400\"><span style=\"color:blue;text-decoration:underline\">Connect#694400<\/span><\/a>, DevDiv#477804\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/759806\"><span style=\"color:blue;text-decoration:underline\">Connect#759806<\/span><\/a>, DevDiv#487679\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/763571\"><span style=\"color:blue;text-decoration:underline\">Connect#763571<\/span><\/a>, DevDiv#505570\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/768903\"><span style=\"color:blue;text-decoration:underline\">Connect#768903<\/span><\/a>, DevDiv#505572\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/768899\"><span style=\"color:blue;text-decoration:underline\">Connect#768899<\/span><\/a>, DevDiv#789899\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/802299\"><span style=\"color:blue;text-decoration:underline\">Connect#802299<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* bind() and std::function had several space inefficiencies, which could lead to dramatic time inefficiencies.&nbsp; An example was reported where storing a bound functor in a std::function worked fine on x86, but was almost 10x slower on x64 (DevDiv#490878).&nbsp; This was triggered by x64&#8217;s larger pointers exceeding the limit of our Small Functor Optimization (SFO), assisted by unexpected bloat in bind() and std::function&#8217;s representations.&nbsp; Fixing this involved several things.&nbsp; First, I reworked std::function&#8217;s representation, eliminating unnecessary bloat and making more space available for the SFO.&nbsp; Second, I retuned the SFO, which previously had a very small limit.&nbsp; The limit is officially undocumented and we reserve the right to change it in the future, but I can tell you what it is.&nbsp; In VS 2015, we consider a function object to be &#8220;small&#8221; (and can therefore avoid dynamic memory allocations) if it&#8217;s as big as a basic_string or smaller.&nbsp; (James McNellis suggested this heuristic.)&nbsp; Our basic_string is fairly large due to the Small String Optimization, so this means that functors can store several integers\/pointers while remaining within the SFO.&nbsp; Finally, as part of an STL-wide overhaul to use compressed pairs, bind() compresses empty functors (like stateless lambdas or less&lt;&gt;) and std::function compresses empty allocators (like std::allocator, the default).&nbsp; This avoids wasting the SFO&#8217;s precious bits on storing empty classes.&nbsp; With all of these changes, we expect the SFO to be activated much more frequently.&nbsp; It&#8217;ll still be possible for 64-bit architectures to push user functors over the limit, but far fewer functors will be affected.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">There are minor limitations, which I&#8217;ll mention for completeness.&nbsp; First, std::function doesn&#8217;t attempt to optimize empty functors with stateful allocators.&nbsp; (This doesn&#8217;t matter in practice, because a stateful allocator would have to be just below the SFO&#8217;s limit in order to be affected.)&nbsp; Second, bind() doesn&#8217;t attempt to optimize stateful functors bound to zero arguments.&nbsp; (This is extremely unlikely to matter in practice, because the only reason to bind zero arguments would be for nested bind().&nbsp; bind(pmf\/pmd) isn&#8217;t a reason, because that&#8217;s better written with mem_fn() or a stateless lambda.)&nbsp; Finally, bind() stores bound arguments in a tuple, which isn&#8217;t compressed, so binding placeholders or other empty arguments will pay 1 byte per argument.&nbsp; (This isn&#8217;t a big deal because the size of a bound functor rarely matters except when it exceeds the SFO&#8217;s limit, which we&#8217;ve dramatically increased.&nbsp; We may compress tuple in the future.)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* function::swap() is required to be noexcept.&nbsp; To achieve this, I&#8217;ve given the SFO an additional requirement.&nbsp; A functor must be small and is_nothrow_move_constructible must be true in order to activate the SFO.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* std::function was generating larger object\/executable files than necessary, due to how the SFO was metaprogrammed (DevDiv#1174895).&nbsp; I reworked this, reducing the size of an artificial test case by 12% on x86 and 30% on x64.&nbsp; This was reported by the Office team, and the fix reduced the size of their x64 executable by 9% (they had many std::functions).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The constructor function(F f) is required to store move(f), but we were copying it (DevDiv#759096).&nbsp; While I&#8217;ve fixed this, note that the Standard still requires F to be CopyConstructible, so you can&#8217;t store movable-only functors in std::function.&nbsp; (Usually, STL classes have &#8220;on-demand&#8221; requirements.&nbsp; For example, list&lt;T&gt; doesn&#8217;t require T to be less-than comparable, until you call list&lt;T&gt;::sort(), thanks to how templates work.&nbsp; std::function behaves differently due to type erasure.&nbsp; When you construct function&lt;Signature&gt; from UserFunctor, the std::function needs to generate all the operations on UserFunctor that could possibly be called, because its actual type is about to be erased through the magic of virtual functions, regardless of whether those operations will ultimately be needed by the whole program.&nbsp; Because std::function is CopyConstructible, it must require UserFunctor to be CopyConstructible, regardless of whether you actually copy any std::functions.)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* function&lt;void (Args)&gt; is now required to accept functors with non-void return types (<a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;text-decoration:underline\">LWG 2420<\/span><\/a>, DevDiv#1010027\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/949899\"><span style=\"color:blue;text-decoration:underline\">Connect#949899<\/span><\/a>).&nbsp; If the functor returns anything, it will be ignored.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* For certain types (with long mangled names, like set&lt;wstring&gt;), function&lt;Ret (Args)&gt; emitted warning C4503 &#8220;decorated name length exceeded, name was truncated&#8221; (DevDiv#1053579, DevDiv#1094949\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1052543\"><span style=\"color:blue;text-decoration:underline\">Connect#1052543<\/span><\/a>).&nbsp; This was extremely annoying, although it didn&#8217;t affect runtime behavior.&nbsp; During VS 2015&#8217;s development, this problem temporarily became worse, while I was reworking std::function to properly use allocators.&nbsp; I tracked down the ultimate causes of C4503 and mitigated them as much as possible, so it&#8217;ll be very difficult to trigger unintentionally.&nbsp; (C4503 can&#8217;t be completely avoided with the current name mangling system.&nbsp; The compiler team may change this in the future.)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* reference_wrapper had trouble with function objects that defined result_type (DevDiv#794227), especially function objects that were simultaneously unary and binary (DevDiv#864867).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* reference_wrapper had trouble with function types, like reference_wrapper&lt;int (int)&gt;, where get() and assignment wouldn&#8217;t compile (DevDiv#535636, DevDiv#868374).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* reference_wrapper&lt;AbstractBase&gt; didn&#8217;t work with pure virtual function call operators (DevDiv#391117\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/734305\"><span style=\"color:blue;text-decoration:underline\">Connect#734305<\/span><\/a>, DevDiv#897806\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/828696\"><span style=\"color:blue;text-decoration:underline\">Connect#828696<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* Everything in &lt;functional&gt; (except for the deprecated-in-C++11, removed-in-C++17 stuff like ptr_fun()) now respects arbitrary calling conventions, including __vectorcall, and the compiler options to change the default calling convention (\/Gd, \/Gr, \/Gv, \/Gz).&nbsp; Unlike Boost, this is always supported, so you don&#8217;t need to define macros to enable it.&nbsp; (DevDiv#553067\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/774720\"><span style=\"color:blue;text-decoration:underline\">Connect#774720<\/span><\/a>, DevDiv#563620\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/775554\"><span style=\"color:blue;text-decoration:underline\">Connect#775554<\/span><\/a>, DevDiv#793009\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/804357\"><span style=\"color:blue;text-decoration:underline\">Connect#804357<\/span><\/a>)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>call_once() Overhaul  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">I rewrote call_once() and its associated once_flag from scratch, using Vista+&#8217;s <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/ms683493(v=vs.85).aspx\"><span style=\"color:blue;text-decoration:underline\">InitOnceExecuteOnce()<\/span><\/a> with a handwritten fallback for XP.&nbsp; This fixed all known bugs:  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* Exceptional executions weren&#8217;t handled as required by the Standard (DevDiv#637433\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/781049\"><span style=\"color:blue;text-decoration:underline\">Connect#781049<\/span><\/a>, DevDiv#1086953\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1038276\"><span style=\"color:blue;text-decoration:underline\">Connect#1038276<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* once_flag&#8217;s constructor wasn&#8217;t marked as constexpr as required by the Standard (DevDiv#497946).&nbsp; (Note that while it&#8217;s marked as constexpr in VS 2015 RTM, it&#8217;s affected by the compiler bug DevDiv#1134662 &#8220;constexpr constructors are emitting dynamic initializers&#8221;, which we&#8217;re planning to fix in 2015 Update 1.)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* call_once() previously used a global lock, which led to hangs in certain situations (DevDiv#840791\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/811192\"><span style=\"color:blue;text-decoration:underline\">Connect#811192<\/span><\/a>).&nbsp; This global lock also prevented separate call_once() invocations with separate once_flags from executing simultaneously (DevDiv#1092852).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* call_once() previously used bind(), which it wasn&#8217;t supposed to do.&nbsp; (bind() has special cases for placeholders, reference_wrappers, and nested bind() expressions &#8211; none of which should be treated specially by call_once().)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The new implementation is much more efficient.&nbsp; I measured call_once()&#8217;s performance on my dev box (4-core 8-thread Sandy Bridge i7-2600 3.4 GHz; Server 2008 R2, Win7-class) by having 8 threads hammer a single once_flag with an empty lambda.&nbsp; To make the test take approximately one second, I needed 1M repeats per thread for VS 2013, and 35M for VS 2015.&nbsp; This allowed me to measure call_once()&#8217;s overhead very precisely.&nbsp; (For example, if it takes 1 s of wall clock time for 8 threads to perform 1M calls each, then I say that each call took 1 s \/ 8M =&nbsp;125 ns.)&nbsp; Compared to VS 2013, I observe that <strong>VS 2015 x86 is 37.2x faster<\/strong> (212.0 ns improved to 5.7 ns), and <strong>x64 is 87.7x faster<\/strong> (306.9 ns improved to 3.5 ns).&nbsp; I believe that the difference between x86&#8217;s 5.7 ns and x64&#8217;s 3.5 ns is due to x64&#8217;s zero-overhead table-based exception handling (we need a try\/catch block to transport exceptions, which can&#8217;t be allowed to rampage through InitOnceExecuteOnce()).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>Atomic Fixes  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* atomic&lt;T&gt; now static_asserts that T must be trivially copyable (DevDiv#798735\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/805015\"><span style=\"color:blue;text-decoration:underline\">Connect#805015<\/span><\/a>).&nbsp; For example, atomic&lt;string&gt; will emit a compiler error.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The Standard forgot to say so (tracked by the open issue <a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-active.html\"><span style=\"color:blue;text-decoration:underline\">LWG 2426<\/span><\/a>), but the compare_exchange function family is supposed to read from &#8220;expected&#8221; before performing the atomic operation, and not after (DevDiv#1015776).&nbsp; This permits certain algorithms to be written, e.g. manipulating list nodes.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* shared_ptr&#8217;s atomic_compare_exchange function family could deadlock in certain situations (DevDiv#1066589\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1004269\"><span style=\"color:blue;text-decoration:underline\">Connect#1004269<\/span><\/a>).&nbsp; We fixed this, in addition to other subtle correctness and performance problems.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* &lt;atomic&gt; now supports the \/clr compiler option (DevDiv#1088751\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1041602\"><span style=\"color:blue;text-decoration:underline\">Connect#1041602<\/span><\/a>).&nbsp; Note that the Clause 30 multithreading headers (&lt;thread&gt;, &lt;future&gt;, etc.) remain blocked; we&#8217;ll investigate lifting that restriction in the future.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>Multithreading Fixes (ConcRT Removal)  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">We&#8217;ve reimplemented the STL&#8217;s multithreading primitives to avoid using the Concurrency Runtime (ConcRT).&nbsp; Using ConcRT was a good idea at the time (2012), but it proved to be more trouble than it was worth.&nbsp; Now we&#8217;re using the Windows API directly, which has fixed many bugs.&nbsp; (The only exception is that ConcRT is still used for XP targeting, so XP hasn&#8217;t received these fixes.)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* Using a mutex while constructing a global variable could hang (DevDiv#789979\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/802344\"><span style=\"color:blue;text-decoration:underline\">Connect#802344<\/span><\/a>, DevDiv#968936\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/900741\"><span style=\"color:blue;text-decoration:underline\">Connect#900741<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* async()\/mutex\/etc. would crash when operator new\/delete had been replaced (DevDiv#943284\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/868994\"><span style=\"color:blue;text-decoration:underline\">Connect#868994<\/span><\/a>, DevDiv#1019418\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/962406\"><span style=\"color:blue;text-decoration:underline\">Connect#962406<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* timed_mutex::try_lock_for()\/etc. leaked memory (DevDiv#957609\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/886682\"><span style=\"color:blue;text-decoration:underline\">Connect#886682<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* condition_variable improperly handled zero timeouts (DevDiv#1082065\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1029842\"><span style=\"color:blue;text-decoration:underline\">Connect#1029842<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>Multithreading Fixes (Other)  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* When constructing a std::thread, the Standard requires that &#8220;If the invocation of [the user&#8217;s callable object] terminates with an uncaught exception, std::terminate shall be called.&#8221; (<a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/n4527.pdf\"><span style=\"color:blue;text-decoration:underline\">N4527<\/span><\/a> 30.3.1.2 [thread.thread.constr]\/5).&nbsp; We previously enforced this with try\/catch, but that made debugging difficult (DevDiv#918396\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/845184\"><span style=\"color:blue;text-decoration:underline\">Connect#845184<\/span><\/a>).&nbsp; Now we enforce this by allowing user exceptions to slam into noexcept, which is friendly to debugging.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* condition_variable&#8217;s predicate-wait functions were calling their predicates too often (DevDiv#1114006\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1098841\"><span style=\"color:blue;text-decoration:underline\">Connect#1098841<\/span><\/a>).&nbsp; Now they&#8217;re following the Standard exactly.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* std::thread&#8217;s constructor didn&#8217;t compile with movable-only arguments (DevDiv#377755\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/729886\"><span style=\"color:blue;text-decoration:underline\">Connect#729886<\/span><\/a>, DevDiv#1079684\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1026715\"><span style=\"color:blue;text-decoration:underline\">Connect#1026715<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* this_thread::get_id() was unnecessarily slow (DevDiv#1039430).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* We&#8217;ve fixed all of the correctness issues <a href=\"https:\/\/www.justsoftwaresolutions.co.uk\/news\/just-thread-v1.8.0-released.html\"><span style=\"color:blue;text-decoration:underline\">reported by Anthony Williams<\/span><\/a> (DevDiv#482769), except for &#8220;the std::atomic&lt;&gt; class template cannot be used on types without a default constructor&#8221; which is tracked by the open issue <a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-active.html\"><span style=\"color:blue;text-decoration:underline\">LWG 2334<\/span><\/a>.&nbsp; A couple of the performance issues remain to be investigated.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* When called after main() exits (e.g. in a global destructor), thread::join() could hang (DevDiv#435439\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/747145\"><span style=\"color:blue;text-decoration:underline\">Connect#747145<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* packaged_task::make_ready_at_thread_exit() could hang when called more than once (DevDiv#803317).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* packaged_task::reset() crashed when called on a packaged_task with no shared state (DevDiv#865726).&nbsp; Now it throws future_error with future_errc::no_state as required by the Standard.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* std::thread didn&#8217;t work with DLLs properly; it was possible for a DLL to be unloaded while a thread was still executing code in that DLL (DevDiv#895753).&nbsp; This was especially problematic in Windows Store apps.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* During VS 2015&#8217;s development, timed_mutex\/recursive_timed_mutex&#8217;s try_lock_for()\/try_lock_until() would spin a CPU core at 100% (DevDiv#1114242\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1099043\"><span style=\"color:blue;text-decoration:underline\">Connect#1099043<\/span><\/a>).&nbsp; They&#8217;ve been rewritten to properly block.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* When timing out, condition_variable&#8217;s wait_for()\/etc. could wake up slightly too early (DevDiv#1129370).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>Filesystem Fixes  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">In addition to implementing the <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2014\/n4100.pdf\"><span style=\"color:blue;text-decoration:underline\">N4100<\/span><\/a> Filesystem &#8220;V3&#8221; Technical Specification, we fixed several bugs.&nbsp; (Note that while we&#8217;re providing the TS&#8217;s header &lt;experimental\/filesystem&gt; and namespace std::experimental::filesystem, we&#8217;re also providing the old header &lt;filesystem&gt; and namespace std::tr2::sys for limited back-compat.)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The current_path() getter previously ignored failures (DevDiv#430113).&nbsp; We now throw an exception or report an error_code as appropriate.&nbsp; (In particular, this isn&#8217;t supported for Windows Store apps, so it&#8217;ll fail there.)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* path::generic_string()\/etc. wasn&#8217;t returning forward slashes (DevDiv#982173\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/916517\"><span style=\"color:blue;text-decoration:underline\">Connect#916517<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* Using the compiler option \/Zc:wchar_t- with the filesystem library triggered linker errors (DevDiv#1004799).&nbsp; \/Zc:wchar_t- is an abomination, but we grudgingly support it.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* rename(&#8220;test.txt&#8221;, &#8220;test.txt&#8221;) is required to be a no-op, but we were deleting the file (DevDiv#1066931\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1006361\"><span style=\"color:blue;text-decoration:underline\">Connect#1006361<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The last_write_time() getters and setters were truncating timestamps to whole seconds (DevDiv#1075324\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1018797\"><span style=\"color:blue;text-decoration:underline\">Connect#1018797<\/span><\/a>).&nbsp; Now we&#8217;re preserving Windows&#8217; 100 ns resolution.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The filesystem library has &#8220;throwers&#8221; like &#8220;bool create_directories(const path&amp;)&#8221; and &#8220;non-throwers&#8221; like &#8220;bool create_directories(const path&amp;, error_code&amp;) noexcept&#8221;.&nbsp; Several non-throwers were mistakenly implemented by calling throwers without any try\/catch logic (DevDiv#1180290\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1385031\"><span style=\"color:blue;text-decoration:underline\">Connect#1385031<\/span><\/a>).&nbsp; This would lead to exceptions slamming into noexcept and triggering program termination.&nbsp; We&#8217;ve fixed all known occurrences of this problem by having the non-throwers call other non-throwers.&nbsp; In one case, the thrower is the core implementation, and the non-thrower wraps it in try\/catch.&nbsp; (Note that there are several remaining occurrences of non-throwers calling throwers, but they&#8217;re innocuous because the &#8220;throwers&#8221; involved can&#8217;t actually fail in our implementation.&nbsp; We may rework this in the future, but there was no time for VS 2015 RTM, as this was literally the last STL fix checked in.)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* copy_file(src_path, dest_path, copy_options::update_existing) (optionally with an error_code) is a request to copy\/overwrite src_path to dest_path if and only if src_path is more recently modified (i.e. &#8220;newer overwrites older&#8221;).&nbsp; Due to a reversed timestamp test, our implementation believed that update_existing meant &#8220;older overwrites newer&#8221;.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* last_write_time(path, code), remove_all(path, code), and temp_directory_path(code) had incorrect return values for failure.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* remove_all() previously returned either 0 or 1.&nbsp; Now it correctly returns the number of files removed.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>Visualizer Improvements  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* shared_ptr\/weak_ptr&#8217;s visualizers now display the original pointer stored in the control block (DevDiv#497336).&nbsp; For example, this matters when shared_ptr&lt;Derived&gt; is converted to shared_ptr&lt;Base&gt;, or shared_ptr&lt;Anything&gt; is converted to shared_ptr&lt;void&gt;.&nbsp; The control block remembers the original Derived * or Anything *.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* We now visualize exception_ptr (DevDiv#716887).&nbsp; This required magical custom machinery, implemented by Lukasz Chodorski and Eric Feiveson.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* We now visualize atomic and atomic_flag (DevDiv#756373\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/796725\"><span style=\"color:blue;text-decoration:underline\">Connect#796725<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* reverse_iterator&#8217;s visualizer was technically correct but endlessly confusing (DevDiv#950042\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/879130\"><span style=\"color:blue;text-decoration:underline\">Connect#879130<\/span><\/a>).&nbsp; Now it has special cases for vector\/array\/list iterators and raw pointers.&nbsp; Also, the general case now displays the &#8220;current&#8221; data member as &#8220;base()&#8221; (which is the member function to retrieve it) and has a Synthetic child explaining &#8220;NOTE: *ri is equivalent to *prev(ri.base())&#8221;.&nbsp; This should prevent further confusion.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* We now visualize recursive_mutex (DevDiv#992590\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/926641\"><span style=\"color:blue;text-decoration:underline\">Connect#926641<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* We now visualize future and promise (DevDiv#1014393).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* We now visualize initializer_list and chrono::duration.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The visualizers for tree iterators (map\/multimap\/set\/multiset) now detect end iterators.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>&lt;random&gt; Fixes  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* mt19937_64 is supposed to take 64-bit seeds, but it was truncating them to 32-bit (DevDiv#619912\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/779231\"><span style=\"color:blue;text-decoration:underline\">Connect#779231<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The output of piecewise_linear_distribution was completely incorrect (DevDiv#665556\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/783628\"><span style=\"color:blue;text-decoration:underline\">Connect#783628<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The output of generate_canonical() was completely incorrect (DevDiv#844616\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/811611\"><span style=\"color:blue;text-decoration:underline\">Connect#811611<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The output of binomial_distribution was incorrect for some parameters like (100, 0.991) (DevDiv#940047, DevDiv#1188781\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1444620\"><span style=\"color:blue;text-decoration:underline\">Connect#1444620<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* Distributions and their param_types are supposed to have matching constructors including explicitness, but many differed (DevDiv#977224, DevDiv#1076782\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1021566\"><span style=\"color:blue;text-decoration:underline\">Connect#1021566<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>Iostream\/Locale Fixes  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* put_time() incorrectly treated %z (time zone offset) as a synonym of %Z (time zone name\/abbreviation) (DevDiv#821666\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/808156\"><span style=\"color:blue;text-decoration:underline\">Connect#808156<\/span><\/a>).&nbsp; This was actually a bug in the CRT&#8217;s strftime(), which was fixed by James McNellis.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* Parsing floating-point with iostream&#8217;s operator&gt;&gt;() had inaccurate results (DevDiv#938627\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/866093\"><span style=\"color:blue;text-decoration:underline\">Connect#866093<\/span><\/a>, DevDiv#961116\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/890195\"><span style=\"color:blue;text-decoration:underline\">Connect#890195<\/span><\/a>).&nbsp; We&#8217;ve substantially improved the correctness here, although we&#8217;re still getting a few corner cases wrong, and there are significant performance issues.&nbsp; In the next major version, we&#8217;re planning to switch back to the CRT for floating-point parsing, which has been overhauled for complete correctness (and is much faster than iostream&#8217;s separate codepaths).&nbsp; Note that in VS 2015, the stod()\/to_string() family has been rewritten to use the CRT as required by the Standard.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* We fixed a couple of read overruns in iostream&#8217;s floating-point and integer parsing (DevDiv#900436\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/829931\"><span style=\"color:blue;text-decoration:underline\">Connect#829931<\/span><\/a>, DevDiv#911845\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/840103\"><span style=\"color:blue;text-decoration:underline\">Connect#840103<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* collate::transform() misbehaved when given inputs consisting entirely of null characters, throwing an exception on x86 and allocating a huge string on x64 (DevDiv#869525\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/814337\"><span style=\"color:blue;text-decoration:underline\">Connect#814337<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* basic_istream::ignore(n, delim) was comparing n to INT_MAX, instead of numeric_limits&lt;streamsize&gt;::max() as required by the Standard (DevDiv#964171\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/894605\"><span style=\"color:blue;text-decoration:underline\">Connect#894605<\/span><\/a>).&nbsp; This was a behavioral problem, not cosmetic (we have 32-bit int and 64-bit streamsize).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* time_get::do_get_year() thought that the world will end in 2035 (DevDiv#640278).&nbsp; Old behavior:  <\/span>\n  &nbsp;<\/p>\n<ul>\n<li><span style=\"font-family:Verdana;font-size:12pt\">[0, 135] parsed as [1900, 2035]  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">[136, 1899] set failbit  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">[1900, 2035] parsed literally  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">[2036, 9999] set failbit  <\/span><\/li>\n<\/ul>\n<p>  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">New behavior:  <\/span>\n  &nbsp;<\/p>\n<ul>\n<li><span style=\"font-family:Verdana;font-size:12pt\">[0, 68] parsed as [2000, 2068]  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">[69, 99] parsed as [1969, 1999]  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">[100, 9999] parsed literally  <\/span><\/li>\n<\/ul>\n<p>  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* Additionally, time_get::do_get_year() wasn&#8217;t following <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/n4527.pdf\"><span style=\"color:blue;text-decoration:underline\">N4527<\/span><\/a> 22.4 [locale.categories]\/2 &#8220;The get() members take an ios_base::iostate&amp; argument whose value they ignore, but set to ios_base::failbit in case of a parse error.&#8221; (DevDiv#990695), because it wasn&#8217;t ignoring the incoming value.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* We fixed an inconsistency in our internal _Yarn machinery that affected the Intel compiler (DevDiv#879860\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/817221\"><span style=\"color:blue;text-decoration:underline\">Connect#817221<\/span><\/a>).&nbsp; (It&#8217;s named that way because yarn is similar to string and cats love yarn.)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>&lt;system_error&gt; Fixes  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* system_category().default_error_condition() was thoroughly incorrect, affecting most uses of system_category() (DevDiv#781294\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/800821\"><span style=\"color:blue;text-decoration:underline\">Connect#800821<\/span><\/a>).&nbsp; Given a Windows error code, if its value happened to be a valid Posix error code value (but not necessarily the same meaning &#8211; typically a totally different meaning!), it would return that value tagged with generic_category().&nbsp; Now we&#8217;re implementing <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/n4527.pdf\"><span style=\"color:blue;text-decoration:underline\">N4527<\/span><\/a> 19.5.1.5 [syserr.errcat.objects]\/4 properly: &#8220;If the argument ev corresponds to a POSIX errno value posv, the function shall return error_condition(posv, generic_category()). Otherwise, the function shall return error_condition(ev, system_category()). What constitutes correspondence for any given operating system is unspecified.&#8221;  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* Error category objects didn&#8217;t behave properly across different DLLs\/EXEs (DevDiv#666062, DevDiv#1095970\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1053790\"><span style=\"color:blue;text-decoration:underline\">Connect#1053790<\/span><\/a>).&nbsp; The tale of woe here was complicated.&nbsp; Calling generic_category(), for example, is supposed to return a reference to a single unique object, regardless of where it&#8217;s called. &nbsp;This is usually achieved by separate compilation into the STL&#8217;s DLL (or static LIB).&nbsp; However, we can&#8217;t separately compile error_category machinery, because it has a virtual message() returning std::string, whose representation is affected by _ITERATOR_DEBUG_LEVEL.&nbsp; So, generic_category() is implemented header-only &#8211; but that means that different user DLLs end up with different instantiations and therefore different objects.&nbsp; (It&#8217;s also possible for this to cause trouble between a user&#8217;s EXE and the STL&#8217;s DLL.)&nbsp; We fixed this to achieve as much conformance as possible.&nbsp; We&#8217;ve taught error_category, its derived classes, and its operator==()\/operator!=() to consider all generic_category() objects to be equal, even if they live at different addresses in different DLLs (and similarly for the other error category objects in the Standard).&nbsp; This has been implemented so that user-defined error category objects will be unaffected.&nbsp; The only thing we can&#8217;t fix is a direct comparison of error_category addresses (code should use operator==() instead).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* system_category().message() now uses <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/ms679351(v=vs.85).aspx\"><span style=\"color:blue;text-decoration:underline\">FormatMessage()<\/span><\/a> to stringize Windows error codes (DevDiv#1101599\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1075847\"><span style=\"color:blue;text-decoration:underline\">Connect#1075847<\/span><\/a>).&nbsp; This provides more detailed messages for many more error codes than the table we previously used.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>Container Fixes  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The map\/set family rejected empty lambdas as comparators (DevDiv#375529\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/727957\"><span style=\"color:blue;text-decoration:underline\">Connect#727957<\/span><\/a>).&nbsp; This was an example of an STL-wide problem &#8211; we attempted to optimize away empty comparators\/allocators\/etc., but did so inconsistently and incorrectly (e.g. by assuming that empty objects must be default constructible, which is false).&nbsp; unique_ptr and unordered_meow also had trouble with deriving from user-defined deleters\/hashers (e.g. unordered_meow was callable like a functor).&nbsp; I fixed this by implementing a compressed pair with the Empty Base Class Optimization, then overhauling the STL to use it.&nbsp; This centralized compressed pair handles everything correctly &#8211; e.g. it doesn&#8217;t assume default constructible types, it respects final classes, and it must be used as a data member (preventing the unique_ptr\/unordered_meow problems).&nbsp; Here&#8217;s an exhaustive list of what was updated:  <\/span>\n  &nbsp;<\/p>\n<ul>\n<li><span style=\"font-family:Verdana;font-size:12pt\">Sequence containers: deque, forward_list, list, vector (empty allocators)  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">Associative containers: map\/etc. (empty comparators, empty allocators)  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">Unordered containers: unordered_map\/etc. (empty hashers, empty equality predicates, empty allocators)  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">&lt;functional&gt;: bind() (empty callable objects)  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">&lt;functional&gt;: function (empty allocators)  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">&lt;memory&gt;: shared_ptr, allocate_shared() (empty deleters, empty allocators)  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">&lt;memory&gt;: unique_ptr (empty deleters)  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">&lt;string&gt;: basic_string (empty allocators)  <\/span><\/li>\n<\/ul>\n<p>  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The compressed pair overhaul also fixed a compiler error when attempting to convert-move-construct unique_ptrs with custom deleters (DevDiv#1076756\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1021477\"><span style=\"color:blue;text-decoration:underline\">Connect#1021477<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* unordered_meow&#8217;s a.rehash(n) didn&#8217;t quite achieve <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/n4527.pdf\"><span style=\"color:blue;text-decoration:underline\">N4527<\/span><\/a> 23.2.5 [unord.req]&#8217;s postcondition &#8220;a.bucket_count() &gt; a.size() \/ a.max_load_factor() and a.bucket_count() &gt;= n&#8221; (DevDiv#824596).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* unordered_meow insertion was invoking the equality predicate too often, which harmed performance slightly.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* vector&#8217;s insert(const_iterator, const T&amp;) and insert(const_iterator, size_type, const T&amp;) were copying instead of moving elements around (DevDiv#824985).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* list::sort() and forward_list::sort() assumed that they could default-construct allocators, which isn&#8217;t guaranteed (DevDiv#920385).&nbsp; I fixed this by rewriting them from scratch, so they don&#8217;t attempt to allocate any memory now.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The STL was always requiring allocators to be assignable (DevDiv#1119194\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1114355\"><span style=\"color:blue;text-decoration:underline\">Connect#1114355<\/span><\/a>).&nbsp; Now we&#8217;re correctly following <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/n4527.pdf\"><span style=\"color:blue;text-decoration:underline\">N4527<\/span><\/a> 17.6.3.5 [allocator.requirements]\/4, which requires allocators to be CopyAssignable\/MoveAssignable\/swappable when POCCA\/POCMA\/POCS are true.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">&#8220;Fools!&#8221;, hissed the Dark Lord.&nbsp; &#8220;You have entered the realm of allocators, where I have mastery over the lifetimes of all things!&#8221;&nbsp; Then he chanted horrifying words of power: &#8220;Pocca, pocma, pocs&#8230;&#8221;  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>Other Fixes  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* &lt;algorithm&gt;&#8217;s search() eagerly called distance(), which wasn&#8217;t very friendly to weaker-than-random iterators (DevDiv#1003120\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/940497\"><span style=\"color:blue;text-decoration:underline\">Connect#940497<\/span><\/a>).&nbsp; Now we have separate implementations for random and weaker iterators.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* stable_sort() performed self-move-assignments, which aren&#8217;t required to be tolerated by elements (DevDiv#957501\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/886652\"><span style=\"color:blue;text-decoration:underline\">Connect#886652<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* regex_match()\/regex_search() weren&#8217;t correctly setting m.prefix().matched\/m.suffix().matched (DevDiv#903531).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* basic_regex&#8217;s copy constructor wasn&#8217;t thread-safe (DevDiv#1158803\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1253646\"><span style=\"color:blue;text-decoration:underline\">Connect#1253646<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* is_assignable didn&#8217;t tolerate overloaded comma operators (DevDiv#938759).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* is_trivially_copyable returned incorrect answers (DevDiv#807340\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/806233\"><span style=\"color:blue;text-decoration:underline\">Connect#806233<\/span><\/a>, DevDiv#940515\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/868824\"><span style=\"color:blue;text-decoration:underline\">Connect#868824<\/span><\/a>).&nbsp; We had mistakenly implemented it as a synonym of is_trivially_copy_constructible.&nbsp; Now, is_trivially_copyable is implemented with a compiler hook, which has been fixed to return correct answers.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* &lt;string&gt; now provides proper u16string\/u32string typedefs (DevDiv#1078492\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1023646\"><span style=\"color:blue;text-decoration:underline\">Connect#1023646<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The stod() family mishandled INF\/NAN inputs by throwing exceptions (DevDiv#1113936\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1098595\"><span style=\"color:blue;text-decoration:underline\">Connect#1098595<\/span><\/a>).&nbsp; We&#8217;re now following the Standards exactly.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* bitset&#8217;s constructor was validating characters, but not following <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/n4527.pdf\"><span style=\"color:blue;text-decoration:underline\">N4527<\/span><\/a> 20.6.1 [bitset.cons]\/5 exactly (DevDiv#931383).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* pair\/tuple didn&#8217;t have defaulted move constructors as required by the Standard (DevDiv#961569\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/891428\"><span style=\"color:blue;text-decoration:underline\">Connect#891428<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The STL now tolerates _USE_32BIT_TIME_T, but that option is still incredibly evil (DevDiv#972321\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/904065\"><span style=\"color:blue;text-decoration:underline\">Connect#904065<\/span><\/a>, DevDiv#1026777\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/972033\"><span style=\"color:blue;text-decoration:underline\">Connect#972033<\/span><\/a>).  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* The option _HAS_EXCEPTIONS=0 is undocumented, untested, and unsupported by Microsoft.&nbsp; We pick it up from Dinkumware&#8217;s master sources and try not to mess with it.&nbsp; At our discretion, we&#8217;re occasionally willing to fix major problems with this option.&nbsp; The bug report DevDiv#1073766\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1015473\"><span style=\"color:blue;text-decoration:underline\">Connect#1015473<\/span><\/a> observed that 2015&#8217;s support for noexcept was emitting EH logic even for _HAS_EXCEPTIONS=0.&nbsp; We chose to fix this, so 2015&#8217;s _HAS_EXCEPTIONS=0 will behave like 2013&#8217;s did.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* By <a href=\"http:\/\/blogs.msdn.com\/b\/vcblog\/archive\/2015\/06\/02\/constexpr-complete-for-vs-2015-rtm-c-11-compiler-c-17-stl.aspx\"><span style=\"color:blue;text-decoration:underline\">implementing constexpr<\/span><\/a>, we&#8217;ve fixed all &#8220;missing constexpr&#8221; bugs (DevDiv#961568\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/891373\"><span style=\"color:blue;text-decoration:underline\">Connect#891373<\/span><\/a>, DevDiv#1074023\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1015584\"><span style=\"color:blue;text-decoration:underline\">Connect#1015584<\/span><\/a>, DevDiv#1148036\/<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1211985\"><span style=\"color:blue;text-decoration:underline\">Connect#1211985<\/span><\/a>), with a very small number of exceptions that are being tracked.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>Library Issues  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">Between VS 2015 CTP1 and RTM, we implemented 23 C++14\/17 Library Issues (which are fixes for bugs in the Standard itself):  <\/span>\n  &nbsp;<\/p>\n<ul>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2009<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> Reporting out-of-bound values on numeric string conversions  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2094<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> duration conversion overflow shouldn&#8217;t participate in overload resolution  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2103<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> std::allocator_traits&lt;std::allocator&lt;T&gt;&gt;::propagate_on_container_move_assignment  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2275<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> Why is forward_as_tuple not constexpr?  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2280<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> begin \/ end for arrays should be constexpr and noexcept  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2301<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> Why is std::tie not constexpr?  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2129<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> User specializations of std::initializer_list  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2212<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> tuple_size for const pair request header  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2365<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> Missing noexcept in shared_ptr::shared_ptr(nullptr_t)  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2399<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> shared_ptr&#8217;s constructor from unique_ptr should be constrained  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2400<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> shared_ptr&#8217;s get_deleter() should use addressof()  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2401<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> std::function needs more noexcept  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2403<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> stof() should call strtof() and wcstof()  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2407<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> packaged_task(allocator_arg_t, const Allocator&amp;, F&amp;&amp;) should neither be constrained nor explicit  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2420<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> function&lt;void(ArgTypes&#8230;)&gt; does not discard the return value of the target object  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2433<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> uninitialized_copy()\/etc. should tolerate overloaded operator&amp;  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2440<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> seed_seq::size() should be noexcept  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2442<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> call_once() shouldn&#8217;t DECAY_COPY()  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2454<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> Add raw_storage_iterator::base() member  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2458<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> N3778 and new library deallocation signatures  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2464<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> try_emplace and insert_or_assign misspecified  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2467<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> is_always_equal has slightly inconsistent default  <\/span><\/li>\n<li><a href=\"http:\/\/cplusplus.github.io\/LWG\/lwg-defects.html\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">LWG 2488<\/span><\/a><span style=\"font-family:Verdana;font-size:12pt\"> Placeholders should be allowed and encouraged to be constexpr  <\/span><\/li>\n<\/ul>\n<p>  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">Jonathan Caves implemented LWG 2129 enforcement in the compiler, because the STL by itself couldn&#8217;t prevent users from explicitly\/partially specializing initializer_list.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">I&#8217;m keeping track of all C++14\/17 Library Issues in a table, but it&#8217;s grown really big (210 rows), so I&#8217;ll just summarize it.&nbsp; 109 issues are N\/A (nothing for an implementer to do).&nbsp; 32 issues were implemented in VS 2013 (and possibly earlier).&nbsp; 47 issues were newly implemented in VS 2015 (24 <a href=\"http:\/\/blogs.msdn.com\/b\/vcblog\/archive\/2014\/06\/06\/c-14-stl-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1.aspx\"><span style=\"color:blue;text-decoration:underline\">listed last year<\/span><\/a> plus 23 listed here).&nbsp; 22 issues remain to be implemented.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>Breaking Changes  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* During TR1\/C++0x&#8217;s evolution, many type traits went through name changes before being finalized in C++11.&nbsp; In VS 2013, we supported both the old names and the new names.&nbsp; Although the old names were synonyms for the new names (so we didn&#8217;t have divergent implementations), this was undesirable for several reasons.&nbsp; First, it created a confusing mess of names.&nbsp; Second, it encouraged non-Standard code to be written, for no benefit whatsoever. &nbsp;Finally, it embiggened &lt;type_traits&gt; and reduced compiler throughput, however slightly.&nbsp; So in VS 2015, we&#8217;ve removed the old names.&nbsp; If you were using them, you&#8217;ll have to change your code to use the new names.&nbsp; (They&#8217;re synonymous, so there&#8217;s no behavioral impact.)  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">Here&#8217;s the mapping from Old Name (TR1\/C++0x) ==&gt; New Name (C++11 and beyond):  <\/span>\n  &nbsp;<\/p>\n<ul>\n<li><span style=\"font-family:Verdana;font-size:12pt\">add_reference ==&gt; add_lvalue_reference  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_default_constructor ==&gt; is_default_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_copy_constructor ==&gt; is_copy_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_move_constructor ==&gt; is_move_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_copy_assign ==&gt; is_copy_assignable  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_move_assign ==&gt; is_move_assignable  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_nothrow_constructor ==&gt; is_nothrow_default_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_nothrow_default_constructor ==&gt; is_nothrow_default_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_nothrow_copy ==&gt; is_nothrow_copy_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_nothrow_copy_constructor ==&gt; is_nothrow_copy_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_nothrow_move_constructor ==&gt; is_nothrow_move_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_nothrow_assign ==&gt; is_nothrow_copy_assignable  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_nothrow_copy_assign ==&gt; is_nothrow_copy_assignable  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_nothrow_move_assign ==&gt; is_nothrow_move_assignable  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_trivial_constructor ==&gt; is_trivially_default_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_trivial_default_constructor ==&gt; is_trivially_default_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_trivial_copy ==&gt; is_trivially_copy_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_trivial_copy_constructor ==&gt; is_trivially_copy_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_trivial_move_constructor ==&gt; is_trivially_move_constructible  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_trivial_assign ==&gt; is_trivially_copy_assignable  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_trivial_copy_assign ==&gt; is_trivially_copy_assignable  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_trivial_move_assign ==&gt; is_trivially_move_assignable  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">has_trivial_destructor ==&gt; is_trivially_destructible  <\/span><\/li>\n<\/ul>\n<p>  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">Note that throughout the STL, we&#8217;re still supporting std::tr1::MEOW as an alias of std::MEOW, for names that made it into the C++11 Standard unchanged.&nbsp; (For example, is_void.)&nbsp; This support will be removed in the future.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* In &lt;future&gt;, we&#8217;ve removed a couple of non-Standard flags.&nbsp; Here&#8217;s the mapping from non-Standard ==&gt; Standard:  <\/span>\n  &nbsp;<\/p>\n<ul>\n<li><span style=\"font-family:Verdana;font-size:12pt\">launch::any ==&gt; launch::async | launch::deferred  <\/span><\/li>\n<li><span style=\"font-family:Verdana;font-size:12pt\">launch::sync ==&gt; launch::deferred  <\/span><\/li>\n<\/ul>\n<p>  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* In the Standard (and all versions of VS), priority_queue&lt;T&gt; has a &#8220;const T&amp; top() const&#8221; member function.&nbsp; In VS 2015, we&#8217;ve removed a non-Standard &#8220;T&amp; top()&#8221; overload.&nbsp; This non-const overload was eye-meltingly dangerous, because it could accidentally be used to violate the data structure&#8217;s invariants.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">* After reimplementing timed_mutex\/recursive_timed_mutex, we had to remove their native_handle_type\/native_handle(), because they don&#8217;t directly wrap an underlying implementation anymore.&nbsp; Note that this is permitted by the Standard; see <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/n4527.pdf\"><span style=\"color:blue;text-decoration:underline\">N4527<\/span><\/a> 30.2.3 [thread.req.native]\/1: &#8220;Several classes described in this Clause have members native_handle_type and native_handle. The presence of these members and their semantics is implementation-defined.&#8221;  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\"><strong>Credits  <\/strong><\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">Unless otherwise specified, these fixes were implemented by myself, P.J. Plauger (Dinkumware), Alex Voicu, Artur Laksberg, and Hong Hong.  <\/span>\n  &nbsp;\n<span style=\"font-family:Verdana;font-size:12pt\">Stephan T. Lavavej  <\/span>\n<span style=\"font-family:Verdana;font-size:12pt\">Senior Developer &#8211; Visual C++ Libraries  <\/span><\/p>\n<p><a href=\"http:\/\/blogs.msdn.commailto:stl@microsoft.com\"><span style=\"color:blue;font-family:Verdana;font-size:12pt;text-decoration:underline\">stl@microsoft.com<\/span><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In addition to implementing a whole bunch of features in VS 2015&#8217;s C++ Standard Library, we&#8217;ve also fixed a whole bunch of bugs.&nbsp; A year ago, I listed the STL fixes in VS 2015 CTP1.&nbsp; Now, it&#8217;s time to list the STL fixes between CTP1 and RTM. &nbsp; &lt;functional&gt; Overhaul &nbsp; We originally shipped bind()\/function\/mem_fn()\/reference_wrapper\/etc. [&hellip;]<\/p>\n","protected":false},"author":266,"featured_media":35994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-6871","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus"],"acf":[],"blog_post_summary":"<p>In addition to implementing a whole bunch of features in VS 2015&#8217;s C++ Standard Library, we&#8217;ve also fixed a whole bunch of bugs.&nbsp; A year ago, I listed the STL fixes in VS 2015 CTP1.&nbsp; Now, it&#8217;s time to list the STL fixes between CTP1 and RTM. &nbsp; &lt;functional&gt; Overhaul &nbsp; We originally shipped bind()\/function\/mem_fn()\/reference_wrapper\/etc. [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/6871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/users\/266"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=6871"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/6871\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media\/35994"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media?parent=6871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=6871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=6871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}