C++ auto on int16_t casts to integer Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!Are the “usual arithmetic conversions” and the “integer promotions” the same thing?Regular cast vs. static_cast vs. dynamic_castWhat are the differences between a pointer variable and a reference variable in C++?How can I profile C++ code running on Linux?The Definitive C++ Book Guide and ListWhat is the effect of extern “C” in C++?What is the “-->” operator in C++?Why do we need virtual functions in C++?Easiest way to convert int to string in C++C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?Why is reading lines from stdin much slower in C++ than Python?

Tannaka duality for semisimple groups

How to force a browser when connecting to a specific domain to be https only using only the client machine?

How many time has Arya actually used Needle?

Universal covering space of the real projective line?

After Sam didn't return home in the end, were he and Al still friends?

Can an iPhone 7 be made to function as a NFC Tag?

Show current row "win streak"

In musical terms, what properties are varied by the human voice to produce different words / syllables?

NERDTreeMenu Remapping

How do living politicians protect their readily obtainable signatures from misuse?

Resize vertical bars (absolute-value symbols)

Why is it faster to reheat something than it is to cook it?

Putting class ranking in CV, but against dept guidelines

How to write capital alpha?

Special flights

Is it dangerous to install hacking tools on my private linux machine?

As a dual citizen, my US passport will expire one day after traveling to the US. Will this work?

Why is std::move not [[nodiscard]] in C++20?

If Windows 7 doesn't support WSL, then what is "Subsystem for UNIX-based Applications"?

What does 丫 mean? 丫是什么意思?

A term for a woman complaining about things/begging in a cute/childish way

How would you say "es muy psicólogo"?

Flight departed from the gate 5 min before scheduled departure time. Refund options

What does Turing mean by this statement?



C++ auto on int16_t casts to integer



Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)
Data science time! April 2019 and salary with experience
The Ask Question Wizard is Live!Are the “usual arithmetic conversions” and the “integer promotions” the same thing?Regular cast vs. static_cast vs. dynamic_castWhat are the differences between a pointer variable and a reference variable in C++?How can I profile C++ code running on Linux?The Definitive C++ Book Guide and ListWhat is the effect of extern “C” in C++?What is the “-->” operator in C++?Why do we need virtual functions in C++?Easiest way to convert int to string in C++C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?Why is reading lines from stdin much slower in C++ than Python?



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








19















I am pretty new to C++17 and am attempting to understand the decltype keyword and how it pairs with auto.



Below is a snippet of code that produces an unexpected result.



#include <typeinfo>
#include <iostream>
#include <algorithm>

using namespace std;

int main()

int16_t mid = 4;
auto low = mid - static_cast<int16_t>(2);
auto hi = mid + static_cast<int16_t>(2);

int16_t val;
cin >> val;

val = std::clamp(val,low,hi);

return 0;



Surprisingly, the compiler tells me there is a mismatch in clamp and that low and high are int. If I change auto to int16_t all is good in the world and all the types are int16_t as expected.



The question I'm posing is, why does auto cast low and hi to int when all of the types are int16_t? Is this a good use case for decltype?



Even after reading cppreference.com, I don't fully understand how decltype works, so excuse my ignorance.










share|improve this question






























    19















    I am pretty new to C++17 and am attempting to understand the decltype keyword and how it pairs with auto.



    Below is a snippet of code that produces an unexpected result.



    #include <typeinfo>
    #include <iostream>
    #include <algorithm>

    using namespace std;

    int main()

    int16_t mid = 4;
    auto low = mid - static_cast<int16_t>(2);
    auto hi = mid + static_cast<int16_t>(2);

    int16_t val;
    cin >> val;

    val = std::clamp(val,low,hi);

    return 0;



    Surprisingly, the compiler tells me there is a mismatch in clamp and that low and high are int. If I change auto to int16_t all is good in the world and all the types are int16_t as expected.



    The question I'm posing is, why does auto cast low and hi to int when all of the types are int16_t? Is this a good use case for decltype?



    Even after reading cppreference.com, I don't fully understand how decltype works, so excuse my ignorance.










    share|improve this question


























      19












      19








      19


      1






      I am pretty new to C++17 and am attempting to understand the decltype keyword and how it pairs with auto.



      Below is a snippet of code that produces an unexpected result.



      #include <typeinfo>
      #include <iostream>
      #include <algorithm>

      using namespace std;

      int main()

      int16_t mid = 4;
      auto low = mid - static_cast<int16_t>(2);
      auto hi = mid + static_cast<int16_t>(2);

      int16_t val;
      cin >> val;

      val = std::clamp(val,low,hi);

      return 0;



      Surprisingly, the compiler tells me there is a mismatch in clamp and that low and high are int. If I change auto to int16_t all is good in the world and all the types are int16_t as expected.



      The question I'm posing is, why does auto cast low and hi to int when all of the types are int16_t? Is this a good use case for decltype?



      Even after reading cppreference.com, I don't fully understand how decltype works, so excuse my ignorance.










      share|improve this question
















      I am pretty new to C++17 and am attempting to understand the decltype keyword and how it pairs with auto.



      Below is a snippet of code that produces an unexpected result.



      #include <typeinfo>
      #include <iostream>
      #include <algorithm>

      using namespace std;

      int main()

      int16_t mid = 4;
      auto low = mid - static_cast<int16_t>(2);
      auto hi = mid + static_cast<int16_t>(2);

      int16_t val;
      cin >> val;

      val = std::clamp(val,low,hi);

      return 0;



      Surprisingly, the compiler tells me there is a mismatch in clamp and that low and high are int. If I change auto to int16_t all is good in the world and all the types are int16_t as expected.



      The question I'm posing is, why does auto cast low and hi to int when all of the types are int16_t? Is this a good use case for decltype?



      Even after reading cppreference.com, I don't fully understand how decltype works, so excuse my ignorance.







      c++ c++17 auto decltype






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Apr 12 at 5:32









      Remy Lebeau

      345k19273466




      345k19273466










      asked Apr 12 at 4:24









      MaxMax

      7591925




      7591925






















          2 Answers
          2






          active

          oldest

          votes


















          20














          The problem isn't with auto here. When you subtract two int16_t values, the result is an int. We can demonstrate it with this code here:



          #include <iostream>
          #include <cstdint>
          using namespace std;

          template<class T>
          void print_type(T)
          std::cout << __PRETTY_FUNCTION__ << std::endl;


          int main()
          int16_t a = 10;
          int16_t b = 20;
          print_type(a);
          print_type(b);
          print_type(a - b);
          return 0;



          a and b are both short ints, but when you add or subtract them it produces a regular int. This is to help prevent overflow / and is also for backwards compatibility.






          share|improve this answer






























            5














            This phenomenon is called the usual arithmetic conversions. It is defined in the C and C++ standards and (roughly said) converts anything smaller than an int to an int. It converts larger types as well. Take some time and read about it, you'll need it quite often.






            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%2f55644479%2fc-auto-on-int16-t-casts-to-integer%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









              20














              The problem isn't with auto here. When you subtract two int16_t values, the result is an int. We can demonstrate it with this code here:



              #include <iostream>
              #include <cstdint>
              using namespace std;

              template<class T>
              void print_type(T)
              std::cout << __PRETTY_FUNCTION__ << std::endl;


              int main()
              int16_t a = 10;
              int16_t b = 20;
              print_type(a);
              print_type(b);
              print_type(a - b);
              return 0;



              a and b are both short ints, but when you add or subtract them it produces a regular int. This is to help prevent overflow / and is also for backwards compatibility.






              share|improve this answer



























                20














                The problem isn't with auto here. When you subtract two int16_t values, the result is an int. We can demonstrate it with this code here:



                #include <iostream>
                #include <cstdint>
                using namespace std;

                template<class T>
                void print_type(T)
                std::cout << __PRETTY_FUNCTION__ << std::endl;


                int main()
                int16_t a = 10;
                int16_t b = 20;
                print_type(a);
                print_type(b);
                print_type(a - b);
                return 0;



                a and b are both short ints, but when you add or subtract them it produces a regular int. This is to help prevent overflow / and is also for backwards compatibility.






                share|improve this answer

























                  20












                  20








                  20







                  The problem isn't with auto here. When you subtract two int16_t values, the result is an int. We can demonstrate it with this code here:



                  #include <iostream>
                  #include <cstdint>
                  using namespace std;

                  template<class T>
                  void print_type(T)
                  std::cout << __PRETTY_FUNCTION__ << std::endl;


                  int main()
                  int16_t a = 10;
                  int16_t b = 20;
                  print_type(a);
                  print_type(b);
                  print_type(a - b);
                  return 0;



                  a and b are both short ints, but when you add or subtract them it produces a regular int. This is to help prevent overflow / and is also for backwards compatibility.






                  share|improve this answer













                  The problem isn't with auto here. When you subtract two int16_t values, the result is an int. We can demonstrate it with this code here:



                  #include <iostream>
                  #include <cstdint>
                  using namespace std;

                  template<class T>
                  void print_type(T)
                  std::cout << __PRETTY_FUNCTION__ << std::endl;


                  int main()
                  int16_t a = 10;
                  int16_t b = 20;
                  print_type(a);
                  print_type(b);
                  print_type(a - b);
                  return 0;



                  a and b are both short ints, but when you add or subtract them it produces a regular int. This is to help prevent overflow / and is also for backwards compatibility.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Apr 12 at 4:36









                  J. Antonio PerezJ. Antonio Perez

                  3,018922




                  3,018922























                      5














                      This phenomenon is called the usual arithmetic conversions. It is defined in the C and C++ standards and (roughly said) converts anything smaller than an int to an int. It converts larger types as well. Take some time and read about it, you'll need it quite often.






                      share|improve this answer



























                        5














                        This phenomenon is called the usual arithmetic conversions. It is defined in the C and C++ standards and (roughly said) converts anything smaller than an int to an int. It converts larger types as well. Take some time and read about it, you'll need it quite often.






                        share|improve this answer

























                          5












                          5








                          5







                          This phenomenon is called the usual arithmetic conversions. It is defined in the C and C++ standards and (roughly said) converts anything smaller than an int to an int. It converts larger types as well. Take some time and read about it, you'll need it quite often.






                          share|improve this answer













                          This phenomenon is called the usual arithmetic conversions. It is defined in the C and C++ standards and (roughly said) converts anything smaller than an int to an int. It converts larger types as well. Take some time and read about it, you'll need it quite often.







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Apr 12 at 5:09









                          Roland IlligRoland Illig

                          31k96493




                          31k96493



























                              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%2f55644479%2fc-auto-on-int16-t-casts-to-integer%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

                              រឿង រ៉ូមេអូ និង ហ្ស៊ុយលីយេ សង្ខេបរឿង តួអង្គ បញ្ជីណែនាំ

                              Crop image to path created in TikZ? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)Crop an inserted image?TikZ pictures does not appear in posterImage behind and beyond crop marks?Tikz picture as large as possible on A4 PageTransparency vs image compression dilemmaHow to crop background from image automatically?Image does not cropTikzexternal capturing crop marks when externalizing pgfplots?How to include image path that contains a dollar signCrop image with left size given

                              QGIS export composer to PDF scale the map [closed] Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?Print Composer QGIS 2.6, how to export image?QGIS 2.8.1 print composer won't export all OpenCycleMap base layer tilesSave Print/Map QGIS composer view as PNG/PDF using Python (without changing anything in visible layout)?Export QGIS Print Composer PDF with searchable text labelsQGIS Print Composer does not change from landscape to portrait orientation?How can I avoid map size and scale changes in print composer?Fuzzy PDF export in QGIS running on macSierra OSExport the legend into its 100% size using Print ComposerScale-dependent rendering in QGIS PDF output