{"id":27117,"date":"2020-11-19T00:07:07","date_gmt":"2020-11-19T00:07:07","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/cppblog\/?p=27117"},"modified":"2020-11-19T00:07:07","modified_gmt":"2020-11-19T00:07:07","slug":"c20-features-in-visual-studio-2019-versions-16-7-and-16-8","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/c20-features-in-visual-studio-2019-versions-16-7-and-16-8\/","title":{"rendered":"C++20 Features in Visual Studio 2019 versions 16.7 and 16.8"},"content":{"rendered":"<h2 aria-level=\"1\"><span data-contrast=\"none\">What\u2019s\u00a0<\/span><span data-contrast=\"none\">New<\/span><\/h2>\n<p><span data-contrast=\"auto\">We have<\/span><span data-contrast=\"auto\">\u00a0continued our efforts to implement C++20 in the MSVC toolset, with\u00a0<\/span><span data-contrast=\"auto\">noteworthy progress<\/span><span data-contrast=\"auto\">\u00a0being made in<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">VS (Visual Studio)<\/span><span data-contrast=\"auto\">\u00a02019 v16.7 and VS 2019 v16.8. This blog post lists the features implemented\u00a0<\/span><span data-contrast=\"auto\">since<\/span> <span data-contrast=\"auto\">the<\/span><span data-contrast=\"auto\">\u00a0<\/span><a href=\"https:\/\/devblogs.microsoft.com\/cppblog\/c20-features-and-fixes-in-vs-2019-16-1-through-16-6\/\"><span data-contrast=\"auto\">C++20 Features and Fixes in VS 2019 16.1 through 16.6<\/span><\/a><span data-contrast=\"auto\"> blog post.<\/span><\/p>\n<p><span data-contrast=\"auto\">This blog post will specifically focus on language features implemented in the\u00a0<\/span><span data-contrast=\"auto\">MSVC\u00a0<\/span><span data-contrast=\"auto\">compiler<\/span><span data-contrast=\"auto\">\u00a0(cl.exe)<\/span><span data-contrast=\"auto\">. The changelog for conformance progress for the STL is tracked in the\u00a0<\/span><a href=\"https:\/\/github.com\/microsoft\/STL\/wiki\/Changelog\"><span data-contrast=\"auto\">Standard Library changelog<\/span><\/a><span data-contrast=\"auto\">\u00a0in the\u00a0<\/span><a href=\"https:\/\/github.com\/microsoft\/stl\"><span data-contrast=\"auto\">Microsoft STL GitHub<\/span><\/a><span data-contrast=\"auto\">\u00a0repo<\/span><span data-contrast=\"auto\">.<\/span><\/p>\n<p><span data-contrast=\"auto\">Some of the features covered <\/span><span data-contrast=\"auto\">were already highlighted in the<\/span><span data-contrast=\"auto\">\u00a0announcements made\u00a0<\/span><span data-contrast=\"auto\">a<\/span><span data-contrast=\"auto\">t<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">CppCon<\/span><span data-contrast=\"auto\">\u00a02020<\/span><span data-contrast=\"auto\"> in September related to the VS 2019 v16.8 Preview 3 release<\/span><span data-contrast=\"auto\">.<\/span><\/p>\n<p><span data-contrast=\"auto\">As a reminder, the\u202f<\/span><a href=\"https:\/\/docs.microsoft.com\/en-us\/cpp\/build\/reference\/std-specify-language-standard-version?view=vs-2019\"><span data-contrast=\"auto\">\/<\/span><span data-contrast=\"auto\">std:c<\/span><span data-contrast=\"auto\">++17 and \/<\/span><span data-contrast=\"auto\">std:c<\/span><span data-contrast=\"auto\">++latest<\/span><\/a><span data-contrast=\"auto\">\u202fcompiler options are necessary to use C++17 and C++20 features<\/span><span data-contrast=\"auto\">, respectively<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2 aria-level=\"1\"><span data-contrast=\"none\">VS 2019 v16.7<\/span><\/h2>\n<h3 aria-level=\"2\"><span data-contrast=\"none\">C++20 Language Feature Support<\/span><\/h3>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1009R2\"><span data-contrast=\"none\">P1009R2<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">Array size deduction in new-expressions<\/span><span data-contrast=\"none\">\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P0722R3\"><span data-contrast=\"none\">P0722R3<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">Efficient<\/span><span data-contrast=\"none\">\u00a0sized\u00a0<\/span><span data-contrast=\"none\">delete<\/span><span data-contrast=\"none\">\u00a0for variable sized classes<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1094R2\"><span data-contrast=\"none\">P1094R2<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">Nested inline namespaces<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"4\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1331R2\"><span data-contrast=\"none\">P1331R2<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">Permitting trivial default initialization in\u00a0constexpr\u00a0contexts<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"5\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1816R0\"><span data-contrast=\"none\">P1816R0<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">CTAD for aggregates<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P0388R4\"><span data-contrast=\"none\">P0388R4<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">Permit conversions to arrays of unknown bound<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1452R2\"><span data-contrast=\"none\">P1452R2<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">On the non-uniform semantics of return-type-requirements<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1152R4\"><span data-contrast=\"none\">P1152R4<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">Deprecating volatile<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"4\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1814R0\"><span data-contrast=\"none\">P1814R0<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">CTAD for alias templates<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"5\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1972R0\"><span data-contrast=\"none\">P1972R0<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">US105 Check satisfaction of constraints for non-templates\u2026<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1980R0\"><span data-contrast=\"none\">P1980R0<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">CA096: Declaration matching for non-dependent requires-clauses<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/p0528r3\"><span data-contrast=\"none\">P0528R3<\/span><\/a><span data-contrast=\"none\">\u00a0A<\/span><span data-contrast=\"none\">tomic compare-and-exchange with\u00a0<\/span><span data-contrast=\"none\">padding<\/span><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">bits<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/p1358r0\"><span data-contrast=\"none\">P1358R0<\/span><\/a><span data-contrast=\"none\">\u00a0T<\/span><span data-contrast=\"none\">ype completeness and derived-to-base pointer\u00a0<\/span><span data-contrast=\"none\">conversions<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"4\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/p0466r5\"><span data-contrast=\"none\">P0466R5<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">L<\/span><span data-contrast=\"none\">ayout-Compatibility<\/span><span data-contrast=\"none\">\u00a0and Pointer-Interconvertibility Traits<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"5\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/p2107r0\"><span data-contrast=\"none\">P2107R0<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">US064 Copy semantics of coroutine\u00a0<\/span><span data-contrast=\"none\">parameters<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">Implemented<\/span><span data-contrast=\"auto\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/p2107r0\"><span data-contrast=\"none\">P2107R0<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"auto\">US052\u00a0<\/span><span data-contrast=\"auto\">Non-executed return statements in\u00a0<\/span><span data-contrast=\"auto\">coroutines<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/p2103r0\"><span data-contrast=\"none\">P2103R0<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">Allow &#8220;import&#8221; inside linkage-specifications [<\/span><span data-contrast=\"none\">dcl.link<\/span><span data-contrast=\"none\">]<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/p2085R0\"><span data-contrast=\"none\">P2085R0<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">Consistent\u00a0<\/span><span data-contrast=\"none\">defaulted<\/span><span data-contrast=\"none\">\u00a0comparisons<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"4\" data-aria-level=\"1\"><span data-contrast=\"auto\">Implemented CWG 2280 Matching a usual deallocation function with placement\u00a0<\/span><span data-contrast=\"auto\">new<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"5\" data-aria-level=\"1\"><span data-contrast=\"auto\">Implemented CWG 2382 Array allocation overhead for non-allocating placement\u00a0<\/span><span data-contrast=\"auto\">new<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">Implemented\u00a0<\/span><span data-contrast=\"auto\">CWG<\/span><span data-contrast=\"auto\">\u00a02441 Inline function\u00a0<\/span><span data-contrast=\"auto\">parameters<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"auto\">Implemented CWG 2282<\/span><span data-contrast=\"none\">\u00a0Consistency with mismatched aligned\/non-over-aligned allocation\/deallocation functions<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"2\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span data-contrast=\"auto\">Implemented US212 Converting from T* to bool should be considered\u00a0<\/span><span data-contrast=\"auto\">narrowing<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<h2 aria-level=\"1\"><span data-contrast=\"none\">VS 2019 v<\/span><span data-contrast=\"none\">16.8<\/span><\/h2>\n<h3 aria-level=\"2\"><span data-contrast=\"none\">C++20 Language Feature Support<\/span><\/h3>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1103R3\"><span data-contrast=\"none\">P1103R3<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"auto\">Modules<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P0912R5\"><span data-contrast=\"none\">P0912R5<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"auto\">Coroutines<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1286R2\"><span data-contrast=\"none\">P1286R2<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"auto\">Contra CWG DR1778<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P0315R4\"><span data-contrast=\"none\">P0315R4<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"auto\">Allowing lambdas in unevaluated contexts<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P0960R3\"><span data-contrast=\"none\">P0960R3<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"auto\">Allow initializing aggregates from a parenthesized list of values<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P0848R3\"><span data-contrast=\"none\">P0848R3<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"auto\">Conditionally trivial special member functions<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1811R0\"><span data-contrast=\"none\">P1811R0<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"auto\">Relaxing redefinition restrictions for re-exportation robustness<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1766R1\"><span data-contrast=\"none\">P1766R1<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"auto\">Mitigating minor modules maladies<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1975R0\"><span data-contrast=\"none\">P1975R0<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"auto\">Fixing the wording of parenthesized aggregate-initialization<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"none\">Implemented<\/span><span data-contrast=\"none\">\u00a0<\/span><a href=\"https:\/\/wg21.link\/P1874R1\"><span data-contrast=\"none\">P1874R1<\/span><\/a><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"auto\">Dynamic Initialization Order of Non-Local Variables in Modules<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Two of the major features of C++20,\u00a0<\/span><a href=\"https:\/\/devblogs.microsoft.com\/cppblog\/standard-c20-modules-support-with-msvc-in-visual-studio-2019-version-16-8\/\"><span data-contrast=\"none\">Modules<\/span><\/a><span data-contrast=\"auto\">\u00a0and\u00a0<\/span><a href=\"https:\/\/devblogs.microsoft.com\/cppblog\/c-coroutines-in-visual-studio-2019-version-16-8\/\"><span data-contrast=\"none\">Coroutines<\/span><\/a><span data-contrast=\"auto\">, are now feature-complete in the MSVC toolset and are now implied by the \/<\/span><span data-contrast=\"auto\">std:c<\/span><span data-contrast=\"auto\">++latest compiler switch.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<h3 aria-level=\"2\"><span data-contrast=\"none\">Strict conformance mode (\/permissive-) and \/<\/span><span data-contrast=\"none\">std:c<\/span><span data-contrast=\"none\">++latest<\/span><\/h3>\n<p><span data-contrast=\"auto\">As a prerequisite for Modules support, `\/permissive-` is now enabled when \/<\/span><span data-contrast=\"auto\">std:c<\/span><span data-contrast=\"auto\">++latest is specified<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-contrast=\"auto\">See<\/span><span data-contrast=\"auto\">\u00a0<\/span><a href=\"https:\/\/docs.microsoft.com\/en-us\/cpp\/build\/reference\/permissive-standards-conformance?view=vs-2019\"><span data-contrast=\"none\">\/permissive-\u00a0<\/span><span data-contrast=\"none\">documentation<\/span><\/a><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">regarding<\/span><span data-contrast=\"auto\">\u00a0compiling code under `\/permissive-`.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">For code that previously compiled under \/<\/span><span data-contrast=\"auto\">std:c<\/span><span data-contrast=\"auto\">++latest and requires non-conformant compiler behaviors, `\/permissive` may be specified to turn off strict conformance mode in the compiler and must appear after \/<\/span><span data-contrast=\"auto\">std:c<\/span><span data-contrast=\"auto\">++latest in the command line argument list.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">However, specifying `\/permissive` will result in an error if Modules usage is\u00a0<\/span><span data-contrast=\"auto\">encountered<\/span><span data-contrast=\"auto\">:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p>error C1214: Modules conflict with non-standard behavior requested via &#8216;[option]&#8217;<\/p>\n<p><span data-contrast=\"auto\">Where the most common values for [<\/span><span data-contrast=\"auto\">option<\/span><span data-contrast=\"auto\">] are:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"auto\">`\/<\/span><span data-contrast=\"auto\">Zc:twoPhase<\/span><span data-contrast=\"auto\">&#8211;<\/span><span data-contrast=\"auto\">`<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">:<\/span><span data-contrast=\"auto\">\u00a0Two Phase name lookup (`\/<\/span><span data-contrast=\"auto\">Zc:twoPhase<\/span><span data-contrast=\"auto\">`) is\u00a0<\/span><span data-contrast=\"auto\">required<\/span><span data-contrast=\"auto\">\u00a0for C++20 Modules and implied by `\/permissive-`<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-contrast=\"auto\">See also [\/<\/span><span data-contrast=\"auto\">Zc:twoPhase<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">documentation](<\/span><span data-contrast=\"auto\">https:\/\/docs.microsoft.com\/en-us\/cpp\/build\/reference\/zc-twophase?view=vs-2019).\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"auto\">`\/<\/span><span data-contrast=\"auto\">Zc:hiddenFriend<\/span><span data-contrast=\"auto\">&#8211;<\/span><span data-contrast=\"auto\">`\u00a0:<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">S<\/span><span data-contrast=\"auto\">tandard hidden friend name lookup rules\u00a0<\/span><span data-contrast=\"auto\">are<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">required<\/span><span data-contrast=\"auto\">\u00a0for C++20 Modules and implied by `\/permissive-`.\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"auto\">`\/<\/span><span data-contrast=\"auto\">Zc:preprocessor<\/span><span data-contrast=\"auto\">&#8211;<\/span><span data-contrast=\"auto\">` :<\/span><span data-contrast=\"auto\">\u00a0Use of the conformant preprocessor (\/<\/span><span data-contrast=\"auto\">Zc:preprocessor<\/span><span data-contrast=\"auto\">) is\u00a0<\/span><span data-contrast=\"auto\">required<\/span><span data-contrast=\"auto\">\u00a0for C++20 header unit usage and creation only<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-contrast=\"auto\">Named Modules do not require this\u00a0<\/span><span data-contrast=\"auto\">option<\/span><span data-contrast=\"auto\">. See also \/<\/span><span data-contrast=\"auto\">Zc:preprocessor<\/span><span data-contrast=\"auto\">\u00a0documentation](<\/span><a href=\"https:\/\/docs.microsoft.com\/en-us\/cpp\/build\/reference\/zc-preprocessor?view=vs-2019\"><span data-contrast=\"none\">https:\/\/docs.microsoft.com\/en-us\/cpp\/build\/reference\/zc-preprocessor?view=vs-2019<\/span><\/a><span data-contrast=\"auto\">)\u00a0<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/li>\n<\/ul>\n<h2 aria-level=\"1\"><span data-contrast=\"none\">More Information<\/span><\/h2>\n<p>For Visual Studio changes (beyond the C++ toolset) and download links, see the\u00a0<a href=\"https:\/\/docs.microsoft.com\/en-us\/visualstudio\/releases\/2019\/release-notes\">VS Release Notes<\/a>\u00a0and\u00a0<a href=\"https:\/\/docs.microsoft.com\/en-us\/visualstudio\/releases\/2019\/release-notes-preview\">VS Preview Release Notes<\/a>. You can report bugs through\u00a0<a href=\"https:\/\/developercommunity.visualstudio.com\/spaces\/62\/index.html\">Developer Community<\/a>, and you can also report STL bugs via\u00a0<a href=\"https:\/\/github.com\/microsoft\/STL\/issues\">microsoft\/STL GitHub issues<\/a>.<\/p>\n<p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>What\u2019s\u00a0New We have\u00a0continued our efforts to implement C++20 in the MSVC toolset, with\u00a0noteworthy progress\u00a0being made in\u00a0VS (Visual Studio)\u00a02019 v16.7 and VS 2019 v16.8. This blog post lists the features implemented\u00a0since the\u00a0C++20 Features and Fixes in VS 2019 16.1 through 16.6 blog post. This blog post will specifically focus on language features implemented in the\u00a0MSVC\u00a0compiler\u00a0(cl.exe). The [&hellip;]<\/p>\n","protected":false},"author":44789,"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-27117","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus"],"acf":[],"blog_post_summary":"<p>What\u2019s\u00a0New We have\u00a0continued our efforts to implement C++20 in the MSVC toolset, with\u00a0noteworthy progress\u00a0being made in\u00a0VS (Visual Studio)\u00a02019 v16.7 and VS 2019 v16.8. This blog post lists the features implemented\u00a0since the\u00a0C++20 Features and Fixes in VS 2019 16.1 through 16.6 blog post. This blog post will specifically focus on language features implemented in the\u00a0MSVC\u00a0compiler\u00a0(cl.exe). The [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/27117","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\/44789"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=27117"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/27117\/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=27117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=27117"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=27117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}