Structured binding on const The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) The Ask Question Wizard is Live! Data science time! April 2019 and salary with experienceHow to convert a std::string to const char* or char*?What is the difference between const int*, const int * const, and int const *?const pointers in overload resolutionString literal in templates - different behavior of compilersConfirm This Standard Library Bug Relating to Allocators in MSVC 2015 RCCapturing array of vectors in lambda makes elements constExplicit destructor call with decltypeWhy “int & const” compiles fine with MSVC?Visual accept std::string from std::byte iteratorShall structured binding to a copy of a const c-array be const?

How does ice melt when immersed in water

Change bounding box of math glyphs in LuaTeX

Typeface like Times New Roman but with "tied" percent sign

How to politely respond to generic emails requesting a PhD/job in my lab? Without wasting too much time

Windows 10: How to Lock (not sleep) laptop on lid close?

how can a perfect fourth interval be considered either consonant or dissonant?

Do working physicists consider Newtonian mechanics to be "falsified"?

Why does the Event Horizon Telescope (EHT) not include telescopes from Africa, Asia or Australia?

Is above average number of years spent on PhD considered a red flag in future academia or industry positions?

Derivation tree not rendering

First use of “packing” as in carrying a gun

When did F become S in typeography, and why?

Why did all the guest students take carriages to the Yule Ball?

What are these Gizmos at Izaña Atmospheric Research Center in Spain?

What do you call a plan that's an alternative plan in case your initial plan fails?

Why can't wing-mounted spoilers be used to steepen approaches?

Does the AirPods case need to be around while listening via an iOS Device?

Single author papers against my advisor's will?

Wall plug outlet change

Can undead you have reanimated wait inside a portable hole?

Working through the single responsibility principle (SRP) in Python when calls are expensive

How are presidential pardons supposed to be used?

What's the point in a preamp?

What is special about square numbers here?



Structured binding on const



The 2019 Stack Overflow Developer Survey Results Are In
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)
The Ask Question Wizard is Live!
Data science time! April 2019 and salary with experienceHow to convert a std::string to const char* or char*?What is the difference between const int*, const int * const, and int const *?const pointers in overload resolutionString literal in templates - different behavior of compilersConfirm This Standard Library Bug Relating to Allocators in MSVC 2015 RCCapturing array of vectors in lambda makes elements constExplicit destructor call with decltypeWhy “int & const” compiles fine with MSVC?Visual accept std::string from std::byte iteratorShall structured binding to a copy of a const c-array be const?



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








11















Is the following code supposed to compile?



#include <type_traits>

void foo()
const std::pair<int, int> x = 1, 2;

auto [a, b] = x;

static_assert(std::is_const_v<decltype(a)>);
static_assert(std::is_const_v<decltype(b)>);




  • MSVC says "yes!".


  • GCC says "oh no, man!".


  • Clang says "no way!".


So, is this an MSVC bug?



The standard is not straightforward here (I had a quick look), but considering the rules for auto, I suppose, a and b should be copied discarding cv-qualifier.










share|improve this question






























    11















    Is the following code supposed to compile?



    #include <type_traits>

    void foo()
    const std::pair<int, int> x = 1, 2;

    auto [a, b] = x;

    static_assert(std::is_const_v<decltype(a)>);
    static_assert(std::is_const_v<decltype(b)>);




    • MSVC says "yes!".


    • GCC says "oh no, man!".


    • Clang says "no way!".


    So, is this an MSVC bug?



    The standard is not straightforward here (I had a quick look), but considering the rules for auto, I suppose, a and b should be copied discarding cv-qualifier.










    share|improve this question


























      11












      11








      11








      Is the following code supposed to compile?



      #include <type_traits>

      void foo()
      const std::pair<int, int> x = 1, 2;

      auto [a, b] = x;

      static_assert(std::is_const_v<decltype(a)>);
      static_assert(std::is_const_v<decltype(b)>);




      • MSVC says "yes!".


      • GCC says "oh no, man!".


      • Clang says "no way!".


      So, is this an MSVC bug?



      The standard is not straightforward here (I had a quick look), but considering the rules for auto, I suppose, a and b should be copied discarding cv-qualifier.










      share|improve this question
















      Is the following code supposed to compile?



      #include <type_traits>

      void foo()
      const std::pair<int, int> x = 1, 2;

      auto [a, b] = x;

      static_assert(std::is_const_v<decltype(a)>);
      static_assert(std::is_const_v<decltype(b)>);




      • MSVC says "yes!".


      • GCC says "oh no, man!".


      • Clang says "no way!".


      So, is this an MSVC bug?



      The standard is not straightforward here (I had a quick look), but considering the rules for auto, I suppose, a and b should be copied discarding cv-qualifier.







      c++ c++17 structured-bindings






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Mar 25 at 12:19









      einpoklum

      37.3k28134263




      37.3k28134263










      asked Mar 24 at 23:44









      Biagio FestaBiagio Festa

      5,43121240




      5,43121240






















          2 Answers
          2






          active

          oldest

          votes


















          14















          Is the following code supposed to compile?




          It is not. This is an MSVC bug.



          A structured binding declaration introduces a new name (for specification only), e, that is declared like:



          auto e = x;


          The type of e is called E, and since the initializer is tuple-like, the types of the bindings are given by tuple_element_t<i, E>. In this case E is pair<int, int>, so the two types are just int. The rule for decltype of a structured binding is to give the referenced type, so decltype(a) and decltype(b) are both int.



          The important part here is that a and b (the structured bindings) come from the invented variable (e), and not its initializer (x). e is not const because you just declared it auto. What we're doing is copying x, and then taking bindings into this (non-const) copy.






          share|improve this answer






























            8














            The static assertions in your code should fail. Why? Because your code is basically the same as the case of:



            #include <type_traits>

            void foo()
            const int x_1 = 1;
            const int x_2 = 2;

            auto a = x_1;
            auto b = x_2;

            static_assert(std::is_const_v<decltype(a)>);
            static_assert(std::is_const_v<decltype(b)>);



            which does indeed fail on MSVC as well.



            In C++, expression types decay on assignment: the auto sees an int, not a const int. Structured binding simply lets you do more than a single auto binding at a time.



            ... and so the fact that MSVC doesn't fail on the assertions in your code seems to be a bug.






            share|improve this answer

























              Your Answer






              StackExchange.ifUsing("editor", function ()
              StackExchange.using("externalEditor", function ()
              StackExchange.using("snippets", function ()
              StackExchange.snippets.init();
              );
              );
              , "code-snippets");

              StackExchange.ready(function()
              var channelOptions =
              tags: "".split(" "),
              id: "1"
              ;
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function()
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled)
              StackExchange.using("snippets", function()
              createEditor();
              );

              else
              createEditor();

              );

              function createEditor()
              StackExchange.prepareEditor(
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader:
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              ,
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              );



              );













              draft saved

              draft discarded


















              StackExchange.ready(
              function ()
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55329651%2fstructured-binding-on-const%23new-answer', 'question_page');

              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              14















              Is the following code supposed to compile?




              It is not. This is an MSVC bug.



              A structured binding declaration introduces a new name (for specification only), e, that is declared like:



              auto e = x;


              The type of e is called E, and since the initializer is tuple-like, the types of the bindings are given by tuple_element_t<i, E>. In this case E is pair<int, int>, so the two types are just int. The rule for decltype of a structured binding is to give the referenced type, so decltype(a) and decltype(b) are both int.



              The important part here is that a and b (the structured bindings) come from the invented variable (e), and not its initializer (x). e is not const because you just declared it auto. What we're doing is copying x, and then taking bindings into this (non-const) copy.






              share|improve this answer



























                14















                Is the following code supposed to compile?




                It is not. This is an MSVC bug.



                A structured binding declaration introduces a new name (for specification only), e, that is declared like:



                auto e = x;


                The type of e is called E, and since the initializer is tuple-like, the types of the bindings are given by tuple_element_t<i, E>. In this case E is pair<int, int>, so the two types are just int. The rule for decltype of a structured binding is to give the referenced type, so decltype(a) and decltype(b) are both int.



                The important part here is that a and b (the structured bindings) come from the invented variable (e), and not its initializer (x). e is not const because you just declared it auto. What we're doing is copying x, and then taking bindings into this (non-const) copy.






                share|improve this answer

























                  14












                  14








                  14








                  Is the following code supposed to compile?




                  It is not. This is an MSVC bug.



                  A structured binding declaration introduces a new name (for specification only), e, that is declared like:



                  auto e = x;


                  The type of e is called E, and since the initializer is tuple-like, the types of the bindings are given by tuple_element_t<i, E>. In this case E is pair<int, int>, so the two types are just int. The rule for decltype of a structured binding is to give the referenced type, so decltype(a) and decltype(b) are both int.



                  The important part here is that a and b (the structured bindings) come from the invented variable (e), and not its initializer (x). e is not const because you just declared it auto. What we're doing is copying x, and then taking bindings into this (non-const) copy.






                  share|improve this answer














                  Is the following code supposed to compile?




                  It is not. This is an MSVC bug.



                  A structured binding declaration introduces a new name (for specification only), e, that is declared like:



                  auto e = x;


                  The type of e is called E, and since the initializer is tuple-like, the types of the bindings are given by tuple_element_t<i, E>. In this case E is pair<int, int>, so the two types are just int. The rule for decltype of a structured binding is to give the referenced type, so decltype(a) and decltype(b) are both int.



                  The important part here is that a and b (the structured bindings) come from the invented variable (e), and not its initializer (x). e is not const because you just declared it auto. What we're doing is copying x, and then taking bindings into this (non-const) copy.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Mar 24 at 23:53









                  BarryBarry

                  187k21330607




                  187k21330607























                      8














                      The static assertions in your code should fail. Why? Because your code is basically the same as the case of:



                      #include <type_traits>

                      void foo()
                      const int x_1 = 1;
                      const int x_2 = 2;

                      auto a = x_1;
                      auto b = x_2;

                      static_assert(std::is_const_v<decltype(a)>);
                      static_assert(std::is_const_v<decltype(b)>);



                      which does indeed fail on MSVC as well.



                      In C++, expression types decay on assignment: the auto sees an int, not a const int. Structured binding simply lets you do more than a single auto binding at a time.



                      ... and so the fact that MSVC doesn't fail on the assertions in your code seems to be a bug.






                      share|improve this answer





























                        8














                        The static assertions in your code should fail. Why? Because your code is basically the same as the case of:



                        #include <type_traits>

                        void foo()
                        const int x_1 = 1;
                        const int x_2 = 2;

                        auto a = x_1;
                        auto b = x_2;

                        static_assert(std::is_const_v<decltype(a)>);
                        static_assert(std::is_const_v<decltype(b)>);



                        which does indeed fail on MSVC as well.



                        In C++, expression types decay on assignment: the auto sees an int, not a const int. Structured binding simply lets you do more than a single auto binding at a time.



                        ... and so the fact that MSVC doesn't fail on the assertions in your code seems to be a bug.






                        share|improve this answer



























                          8












                          8








                          8







                          The static assertions in your code should fail. Why? Because your code is basically the same as the case of:



                          #include <type_traits>

                          void foo()
                          const int x_1 = 1;
                          const int x_2 = 2;

                          auto a = x_1;
                          auto b = x_2;

                          static_assert(std::is_const_v<decltype(a)>);
                          static_assert(std::is_const_v<decltype(b)>);



                          which does indeed fail on MSVC as well.



                          In C++, expression types decay on assignment: the auto sees an int, not a const int. Structured binding simply lets you do more than a single auto binding at a time.



                          ... and so the fact that MSVC doesn't fail on the assertions in your code seems to be a bug.






                          share|improve this answer















                          The static assertions in your code should fail. Why? Because your code is basically the same as the case of:



                          #include <type_traits>

                          void foo()
                          const int x_1 = 1;
                          const int x_2 = 2;

                          auto a = x_1;
                          auto b = x_2;

                          static_assert(std::is_const_v<decltype(a)>);
                          static_assert(std::is_const_v<decltype(b)>);



                          which does indeed fail on MSVC as well.



                          In C++, expression types decay on assignment: the auto sees an int, not a const int. Structured binding simply lets you do more than a single auto binding at a time.



                          ... and so the fact that MSVC doesn't fail on the assertions in your code seems to be a bug.







                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited Mar 31 at 17:33

























                          answered Mar 24 at 23:53









                          einpoklumeinpoklum

                          37.3k28134263




                          37.3k28134263



























                              draft saved

                              draft discarded
















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55329651%2fstructured-binding-on-const%23new-answer', 'question_page');

                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Moe incest case Sentencing See also References Navigation menu"'Australian Josef Fritzl' fathered four children by daughter""Small town recoils in horror at 'Australian Fritzl' incest case""Victorian rape allegations echo Fritzl case - Just In (Australian Broadcasting Corporation)""Incest father jailed for 22 years""'Australian Fritzl' sentenced to 22 years in prison for abusing daughter for three decades""RSJ v The Queen"

                              Who is our nearest planetary neighbor, on average?Santa Claus flies to the South PoleSeven Spheres of Unequal Mass, a weighing problem with a twistDescribe a large integerFast Mental Calculation of $7.5^7$Math in Space (without the help of celebrities)Find the value of $bigstar$: Puzzle 8 - InequalityWho drinks beer while running anyway?A Crucial DeliveryRanking And AverageHow long will my money last at roulette?

                              Daza language Contents Vocabulary Phonology References External links Navigation menudaza1242Daza"Dazaga"eeee178086576