{"id":26261,"date":"2020-07-15T14:55:53","date_gmt":"2020-07-15T14:55:53","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/cppblog\/?p=26261"},"modified":"2020-07-15T14:55:53","modified_gmt":"2020-07-15T14:55:53","slug":"initial-support-for-c20-ranges","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/initial-support-for-c20-ranges\/","title":{"rendered":"Initial\u00a0Support\u00a0For C++20 Ranges\u00a0"},"content":{"rendered":"<p><span data-contrast=\"auto\">We are happy to announce that\u00a0<\/span><span data-contrast=\"auto\">Visual Studio 2019 version 16.6\u00a0<\/span><span data-contrast=\"auto\">contains the first\u00a0<\/span><span data-contrast=\"auto\">u<\/span><span data-contrast=\"auto\">ser-visible<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">pieces\u00a0<\/span><span data-contrast=\"auto\">of C++20 Ranges support. We\u2019ve been working on\u00a0<\/span><span data-contrast=\"auto\">support<\/span><span data-contrast=\"auto\">\u00a0machinery for a few releases now<\/span><span data-contrast=\"auto\">, but in this release the tip of the iceberg has finally broken the surface of the water\u00a0<\/span><span data-contrast=\"auto\">and there are now some tools available<\/span><span data-contrast=\"auto\">\u00a0for users<\/span><span data-contrast=\"auto\">.<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">The Ranges\u00a0<\/span><span data-contrast=\"auto\">implementation<\/span><span data-contrast=\"auto\">\u00a0critically depends on C++\u00a0<\/span><span data-contrast=\"auto\">C<\/span><span data-contrast=\"auto\">oncepts, and as such is usable with both MSVC and Clang in<\/span><span data-contrast=\"auto\">\u00a0their C++20 Preview<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">mode<\/span><span data-contrast=\"auto\">s<\/span><span data-contrast=\"auto\">\u00a0but not yet well-supported by\u00a0<\/span><span data-contrast=\"auto\">IntelliSense.<\/span><span data-contrast=\"auto\">\u00a0(Don\u2019t worry, we\u2019ll have proper IntelliSense support\u00a0<\/span><span data-contrast=\"auto\">soon<\/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<h3 aria-level=\"2\"><span data-contrast=\"none\">What\u2019s Available?<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559738&quot;:40,&quot;335559739&quot;:0,&quot;335559740&quot;:259}\">\u00a0<\/span><\/h3>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"4\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">The standard library concepts in\u00a0<\/span><code><span data-contrast=\"auto\">&lt;concepts&gt;<\/span><\/code><span data-contrast=\"auto\">\u00a0ha<\/span><span data-contrast=\"auto\">ve<\/span><span data-contrast=\"auto\">\u00a0been\u00a0<\/span><span data-contrast=\"auto\">shipping\u00a0<\/span><span data-contrast=\"auto\">in MSVC\u00a0<\/span><span data-contrast=\"auto\">since version 16.3<\/span><span data-contrast=\"auto\">.<\/span><span data-contrast=\"auto\">\u00a0This includes<\/span><span data-contrast=\"auto\">\u00a0the customization point<\/span><span data-contrast=\"auto\">\u00a0<\/span><code><span data-contrast=\"auto\">std::<\/span><span data-contrast=\"auto\">ranges::<\/span><span data-contrast=\"auto\">swap<\/span><\/code><span data-contrast=\"auto\">, which is like a smarter\u00a0<\/span><code><span data-contrast=\"auto\">std::<\/span><span data-contrast=\"auto\">swap<\/span><\/code><span data-contrast=\"auto\">\u00a0that does \u201cthe using bit\u201d for you.<\/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=\"4\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"auto\">The first batch of Range\u00a0algorithms in\u00a0<\/span><code><span data-contrast=\"auto\">&lt;algorithm&gt;<\/span><\/code><span data-contrast=\"auto\">:<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"4\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><code><span data-contrast=\"auto\">copy<\/span><\/code><span data-contrast=\"auto\">,\u00a0<\/span><code><span data-contrast=\"auto\">copy_n<\/span><\/code><span data-contrast=\"auto\">, and\u00a0<\/span><code><span data-contrast=\"auto\">copy_if<\/span><\/code><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"4\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><code><span data-contrast=\"auto\">all_of<\/span><\/code><span data-contrast=\"auto\">,\u00a0<\/span><code><span data-contrast=\"auto\">any_of<\/span><\/code><span data-contrast=\"auto\">, and\u00a0<\/span><code><span data-contrast=\"auto\">none_of<\/span><\/code><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"4\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><code><span data-contrast=\"auto\">find<\/span><\/code><span data-contrast=\"auto\">,\u00a0<\/span><code><span data-contrast=\"auto\">find_if<\/span><\/code><span data-contrast=\"auto\">, and\u00a0<\/span><code><span data-contrast=\"auto\">find_if_not<\/span><\/code><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"4\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><code><span data-contrast=\"auto\">count<\/span><\/code><span data-contrast=\"auto\">\u00a0and\u00a0<\/span><code><span data-contrast=\"auto\">count_if<\/span><\/code><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"4\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><code><span data-contrast=\"auto\">for_each<\/span><\/code><span data-contrast=\"auto\">\u00a0and\u00a0<\/span><code><span data-contrast=\"auto\">for_each_n<\/span><\/code><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"4\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><code><span data-contrast=\"auto\">equal<\/span><\/code><span data-contrast=\"auto\">\u00a0and\u00a0<\/span><code><span data-contrast=\"auto\">mismatch<\/span><\/code><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<\/li>\n<\/ul>\n<p><span data-contrast=\"auto\">There\u2019s a brief demo of some of these facilities in\u00a0<\/span><a href=\"https:\/\/www.youtube.com\/watch?v=ArW8n0QBdiE&amp;feature=youtu.be&amp;t=3165\"><span data-contrast=\"none\">Mahmoud Saleh\u2019s talk from the Pure Virtual C++\u00a0<\/span><span data-contrast=\"none\">conference<\/span><\/a><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">(<\/span><a href=\"https:\/\/github.com\/msalehmsft\/VirtualCpp\/blob\/master\/ranges_demo.cpp\"><span data-contrast=\"none\">with code available<\/span><\/a><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<h3 aria-level=\"2\"><span data-contrast=\"none\">What\u2019s Coming Next?<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559738&quot;:40,&quot;335559739&quot;:0,&quot;335559740&quot;:259}\">\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">We have been<\/span><span data-contrast=\"auto\">\u00a0developing the STL\u00a0<\/span><span data-contrast=\"auto\">publicly<\/span><span data-contrast=\"auto\">\u00a0on GitHub since it was open-sourced<\/span><span data-contrast=\"auto\">, so you can always pop over to\u00a0<\/span><a href=\"https:\/\/github.com\/microsoft\/STL\"><span data-contrast=\"none\">https:\/\/github.<\/span><span data-contrast=\"none\">com\/microsoft\/STL<\/span><\/a><span data-contrast=\"auto\">\u00a0to see what we<\/span><span data-contrast=\"auto\">\u2019re working on. The\u00a0<\/span><a href=\"https:\/\/github.com\/microsoft\/STL\/wiki\/Changelog\"><span data-contrast=\"none\">Changelog page in the attached wiki<\/span><\/a><span data-contrast=\"auto\">\u00a0is effectively a set of\u00a0<\/span><span data-contrast=\"auto\">release notes for past and future STL work that we update continuously as pull requests are\u00a0<\/span><span data-contrast=\"auto\">merged.<\/span><span data-contrast=\"auto\">\u00a0<\/span><a href=\"https:\/\/github.com\/microsoft\/STL\/issues\/39#issuecomment-599807825\"><span data-contrast=\"none\">This comment<\/span><\/a><span data-contrast=\"auto\">\u00a0in the\u00a0<\/span><a href=\"https:\/\/github.com\/microsoft\/STL\/issues\/39\"><span data-contrast=\"none\">\u201cImplement Ranges\u201d issue<\/span><\/a><span data-contrast=\"auto\">\u00a0tracks which parts of the R<\/span><span data-contrast=\"auto\">anges design we\u2019ve implemented<\/span><span data-contrast=\"auto\">\u00a0in what pull requests<\/span><span data-contrast=\"auto\">, and even provides a rough idea of what we expect to work on next.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/visualstudio.microsoft.com\/vs\/preview\/\"><span data-contrast=\"none\">Visual Studio 2019 version 16.7\u00a0<\/span><span data-contrast=\"none\">(currently in Preview)<\/span><\/a><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">includes more components of Ranges:<\/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=\"1\" data-aria-level=\"1\"><span data-contrast=\"auto\">A<\/span><span data-contrast=\"auto\">lgorithms\u00a0<\/span><code><span data-contrast=\"auto\">find_<\/span><span data-contrast=\"auto\">end<\/span><\/code><span data-contrast=\"auto\">,\u00a0<\/span><code><span data-contrast=\"auto\">find_<\/span><span data-contrast=\"auto\">fir<\/span><span data-contrast=\"auto\">st_of<\/span><\/code><span data-contrast=\"auto\">,<\/span><span data-contrast=\"auto\">\u00a0and<\/span><span data-contrast=\"auto\">\u00a0<\/span><code><span data-contrast=\"auto\">adjacent_find<\/span><span data-ccp-props=\"{&quot;134233279&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/code><\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"3\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span data-contrast=\"auto\">Updates to\u00a0<\/span><code><span data-contrast=\"auto\">reverse_iterator<\/span><\/code><span data-contrast=\"auto\">\u00a0and\u00a0<\/span><code><span data-contrast=\"auto\">move_iterator<\/span><\/code><span data-contrast=\"auto\">\u00a0to better adapt \u201cnew\u201d Ranges iterator types, including the addition of\u00a0<\/span><code><span data-contrast=\"auto\">move_sentinel<\/span><\/code><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=\"3\" data-aria-level=\"1\"><span data-contrast=\"auto\">The\u00a0<\/span><code><span data-contrast=\"auto\">subrange<\/span><\/code><span data-contrast=\"auto\">\u00a0class template, which aggregates an iterator and sentinel into a convenient range<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">object<\/span><span data-contrast=\"auto\">\u00a0(a view, to be precise)<\/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=\"4\" data-aria-level=\"1\"><span data-contrast=\"auto\">The\u00a0<\/span><code><span data-contrast=\"auto\">view_interface<\/span><\/code><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">base from which view types can inherit some default implementations of simple behaviors<\/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=\"5\" data-aria-level=\"1\"><span data-contrast=\"auto\">The constrained transparent comparison function object types\u00a0<\/span><code><span data-contrast=\"auto\">equal_to<\/span><\/code><span data-contrast=\"auto\">,\u00a0<\/span><code><span data-contrast=\"auto\">not_equal_to<\/span><\/code><span data-contrast=\"auto\">,\u00a0<\/span><code><span data-contrast=\"auto\">less<\/span><\/code><span data-contrast=\"auto\">,\u00a0<\/span><code><span data-contrast=\"auto\">greater<\/span><\/code><span data-contrast=\"auto\">,\u00a0<\/span><code><span data-contrast=\"auto\">less_equal<\/span><\/code><span data-contrast=\"auto\">,\u00a0<\/span><code><span data-contrast=\"auto\">greater_equal<\/span><\/code><span data-contrast=\"auto\">, and\u00a0<\/span><code><span data-contrast=\"auto\">compar<\/span><span data-contrast=\"auto\">e_three_way<\/span><\/code><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<p><span data-contrast=\"auto\">Version 16.8\u00a0<\/span><span data-contrast=\"auto\">will\u00a0<\/span><span data-contrast=\"auto\">include m<\/span><span data-contrast=\"auto\">uch<\/span><span data-contrast=\"auto\">\u00a0more<\/span><span data-contrast=\"auto\">: o<\/span><span data-contrast=\"auto\">ur current plan is to fully support Ranges on Concepts in \/<\/span><span data-contrast=\"auto\">std:c<\/span><span data-contrast=\"auto\">++latest mode\u00a0<\/span><span data-contrast=\"auto\">with IntelliSense\u00a0<\/span><span data-contrast=\"auto\">in 16.8!<\/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\">Kick the Tires<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559738&quot;:40,&quot;335559739&quot;:0,&quot;335559740&quot;:259}\">\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">Please give the available components a try, and we\u2019ll keep them coming. (<\/span><span data-contrast=\"auto\">D<\/span><span data-contrast=\"auto\">on\u2019t forget to d<\/span><span data-contrast=\"auto\">ownload\u00a0<\/span><a href=\"https:\/\/visualstudio.microsoft.com\/vs\/preview\/\"><span data-contrast=\"none\">Visual Studio 2019 version 16.7 Preview<\/span><\/a><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">if\u00a0<\/span><span data-contrast=\"auto\">y<\/span><span data-contrast=\"auto\">ou want to use things mentioned immediately above<\/span><span data-contrast=\"auto\">.<\/span><span data-contrast=\"auto\">)<\/span><span data-contrast=\"auto\">\u00a0We\u2019d love to hear from you to help us prioritize and build the right features for you. We can be reached via the comments below,\u00a0<\/span><a href=\"https:\/\/developercommunity.visualstudio.com\/spaces\/8\/index.html\"><span data-contrast=\"none\">Developer Community<\/span><\/a><span data-contrast=\"auto\">, and\u00a0Twitter (<\/span><a href=\"https:\/\/twitter.com\/visualc\"><span data-contrast=\"none\">@VisualC<\/span><\/a><span data-contrast=\"auto\">).\u00a0<\/span><span data-contrast=\"auto\">For issues and questions specific to the STL<\/span><span data-contrast=\"auto\">\u00a0or our Ranges implementation<\/span><span data-contrast=\"auto\">, t<\/span><span data-contrast=\"auto\">he best way to\u00a0<\/span><span data-contrast=\"auto\">reach is by\u00a0<\/span><a href=\"https:\/\/github.com\/microsoft\/STL\/issues\"><span data-contrast=\"none\">filing an issue on GitHub<\/span><\/a><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","protected":false},"excerpt":{"rendered":"<p>We are happy to announce that\u00a0Visual Studio 2019 version 16.6\u00a0contains the first\u00a0user-visible\u00a0pieces\u00a0of C++20 Ranges support. We\u2019ve been working on\u00a0support\u00a0machinery for a few releases now, but in this release the tip of the iceberg has finally broken the surface of the water\u00a0and there are now some tools available\u00a0for users.\u00a0The Ranges\u00a0implementation\u00a0critically depends on C++\u00a0Concepts, and as such [&hellip;]<\/p>\n","protected":false},"author":1529,"featured_media":35994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1,230],"tags":[],"class_list":["post-26261","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus","category-new-feature"],"acf":[],"blog_post_summary":"<p>We are happy to announce that\u00a0Visual Studio 2019 version 16.6\u00a0contains the first\u00a0user-visible\u00a0pieces\u00a0of C++20 Ranges support. We\u2019ve been working on\u00a0support\u00a0machinery for a few releases now, but in this release the tip of the iceberg has finally broken the surface of the water\u00a0and there are now some tools available\u00a0for users.\u00a0The Ranges\u00a0implementation\u00a0critically depends on C++\u00a0Concepts, and as such [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/26261","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\/1529"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=26261"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/26261\/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=26261"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=26261"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=26261"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}