Structured binding on constWhat is the difference between const int*, const int * const, and int const *?String literal in templates - different behavior of compilersstructured binding with [[maybe_unused]]Capturing array of vectors in lambda makes elements constExplicit destructor call with decltypeWhy “int & const” compiles fine with MSVC?Discards qualifiers unknown cause (std::bind() / lambda)Visual accept std::string from std::byte iteratorC++17 - Binding rvalue reference to non-const lvalue refShall structured binding to a copy of a const c-array be const?

Bob has never been a M before

In Star Trek IV, why did the Bounty go back to a time when whales are already rare?

THT: What is a squared annular “ring”?

Can I rely on this github repository files?

Does the Mind Blank spell prevent the target from being frightened?

How do I implement a file system driver driver in Linux?

Can I use my Chinese passport to enter China after I acquired another citizenship?

How do you respond to a colleague from another team when they're wrongly expecting that you'll help them?

How to color a curve

How will losing mobility of one hand affect my career as a programmer?

Reply 'no position' while the job posting is still there

Query about absorption line spectra

Can a significant change in incentives void an employment contract?

What is the gram­mat­i­cal term for “‑ed” words like these?

Have I saved too much for retirement so far?

Journal losing indexing services

Is it possible to have a strip of cold climate in the middle of a planet?

Can I Retrieve Email Addresses from BCC?

Engineer refusing to file/disclose patents

We have a love-hate relationship

When quoting, must I also copy hyphens used to divide words that continue on the next line?

What (else) happened July 1st 1858 in London?

If a character with the Alert feat rolls a crit fail on their Perception check, are they surprised?

Difference between -| and |- in TikZ



Structured binding on const


What is the difference between const int*, const int * const, and int const *?String literal in templates - different behavior of compilersstructured binding with [[maybe_unused]]Capturing array of vectors in lambda makes elements constExplicit destructor call with decltypeWhy “int & const” compiles fine with MSVC?Discards qualifiers unknown cause (std::bind() / lambda)Visual accept std::string from std::byte iteratorC++17 - Binding rvalue reference to non-const lvalue refShall structured binding to a copy of a const c-array be const?













6















Is the following code supposed to compile?



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


























    6















    Is the following code supposed to compile?



    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
























      6












      6








      6








      Is the following code supposed to compile?



      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?



      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










      asked 6 hours ago









      Biagio FestaBiagio Festa

      5,18821239




      5,18821239






















          2 Answers
          2






          active

          oldest

          votes


















          7















          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






























            3














            The static assertions should fail (so this would be an MSVC bug I guess). Why? Because it's basically the same as the case of:



            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.






            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









              7















              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



























                7















                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

























                  7












                  7








                  7








                  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 6 hours ago









                  BarryBarry

                  185k21325600




                  185k21325600























                      3














                      The static assertions should fail (so this would be an MSVC bug I guess). Why? Because it's basically the same as the case of:



                      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.






                      share|improve this answer





























                        3














                        The static assertions should fail (so this would be an MSVC bug I guess). Why? Because it's basically the same as the case of:



                        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.






                        share|improve this answer



























                          3












                          3








                          3







                          The static assertions should fail (so this would be an MSVC bug I guess). Why? Because it's basically the same as the case of:



                          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.






                          share|improve this answer















                          The static assertions should fail (so this would be an MSVC bug I guess). Why? Because it's basically the same as the case of:



                          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.







                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited 6 hours ago

























                          answered 6 hours ago









                          einpoklumeinpoklum

                          36.1k28132260




                          36.1k28132260



























                              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

                              Möglingen Índice Localización Historia Demografía Referencias Enlaces externos Menú de navegación48°53′18″N 9°07′45″E / 48.888333333333, 9.129166666666748°53′18″N 9°07′45″E / 48.888333333333, 9.1291666666667Sitio web oficial Mapa de Möglingen«Gemeinden in Deutschland nach Fläche, Bevölkerung und Postleitzahl am 30.09.2016»Möglingen

                              Virtualbox - Configuration error: Querying “UUID” failed (VERR_CFGM_VALUE_NOT_FOUND)“VERR_SUPLIB_WORLD_WRITABLE” error when trying to installing OS in virtualboxVirtual Box Kernel errorFailed to open a seesion for the virtual machineFailed to open a session for the virtual machineUbuntu 14.04 LTS Virtualbox errorcan't use VM VirtualBoxusing virtualboxI can't run Linux-64 Bit on VirtualBoxUnable to insert the virtual optical disk (VBoxguestaddition) in virtual machine for ubuntu server in win 10VirtuaBox in Ubuntu 18.04 Issues with Win10.ISO Installation

                              Antonio De Lisio Carrera Referencias Menú de navegación«Caracas: evolución relacional multipleja»«Cuando los gobiernos subestiman a las localidades: L a Iniciativa para la Integración de la Infraestructura Regional Suramericana (IIRSA) en la frontera Colombo-Venezolana»«Maestría en Planificación Integral del Ambiente»«La Metrópoli Caraqueña: Expansión Simplificadora o Articulación Diversificante»«La Metrópoli Caraqueña: Expansión Simplificadora o Articulación Diversificante»«Conózcanos»«Caracas: evolución relacional multipleja»«La Metrópoli Caraqueña: Expansión Simplificadora o Articulación Diversificante»