C++ auto on int16_t casts to integer Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm 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?

2001: A Space Odyssey's use of the song "Daisy Bell" (Bicycle Built for Two); life imitates art or vice-versa?

Why wasn't DOSKEY integrated with COMMAND.COM?

Where are Serre’s lectures at Collège de France to be found?

Can a party unilaterally change candidates in preparation for a General election?

What do you call the main part of a joke?

Do wooden building fires get hotter than 600°C?

Compare a given version number in the form major.minor.build.patch and see if one is less than the other

How do I find out the mythology and history of my Fortress?

What's the meaning of "fortified infraction restraint"?

Wu formula for manifolds with boundary

How to convince students of the implication truth values?

Is this homebrew Lady of Pain warlock patron balanced?

Do I really need to have a message in a novel to appeal to readers?

Using et al. for a last / senior author rather than for a first author

What are the out-of-universe reasons for the references to Toby Maguire-era Spider-Man in ITSV

Denied boarding although I have proper visa and documentation. To whom should I make a complaint?

Would "destroying" Wurmcoil Engine prevent its tokens from being created?

How do pianists reach extremely loud dynamics?

An adverb for when you're not exaggerating

Delete nth line from bottom

Circuit to "zoom in" on mV fluctuations of a DC signal?

Amount of permutations on an NxNxN Rubik's Cube

What font is "z" in "z-score"?

Do square wave exist?



C++ auto on int16_t casts to integer



Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm 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;








17















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






























    17















    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


























      17












      17








      17


      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

      344k19270464




      344k19270464










      asked Apr 12 at 4:24









      MaxMax

      7491925




      7491925






















          2 Answers
          2






          active

          oldest

          votes


















          18














          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






























            4














            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









              18














              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



























                18














                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

























                  18












                  18








                  18







                  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

                  2,793922




                  2,793922























                      4














                      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



























                        4














                        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

























                          4












                          4








                          4







                          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

                              Club Baloncesto Breogán Índice Historia | Pavillón | Nome | O Breogán na cultura popular | Xogadores | Adestradores | Presidentes | Palmarés | Historial | Líderes | Notas | Véxase tamén | Menú de navegacióncbbreogan.galCadroGuía oficial da ACB 2009-10, páxina 201Guía oficial ACB 1992, páxina 183. Editorial DB.É de 6.500 espectadores sentados axeitándose á última normativa"Estudiantes Junior, entre as mellores canteiras"o orixinalHemeroteca El Mundo Deportivo, 16 setembro de 1970, páxina 12Historia do BreogánAlfredo Pérez, o último canoneiroHistoria C.B. BreogánHemeroteca de El Mundo DeportivoJimmy Wright, norteamericano do Breogán deixará Lugo por ameazas de morteResultados de Breogán en 1986-87Resultados de Breogán en 1990-91Ficha de Velimir Perasović en acb.comResultados de Breogán en 1994-95Breogán arrasa al Barça. "El Mundo Deportivo", 27 de setembro de 1999, páxina 58CB Breogán - FC BarcelonaA FEB invita a participar nunha nova Liga EuropeaCharlie Bell na prensa estatalMáximos anotadores 2005Tempada 2005-06 : Tódolos Xogadores da Xornada""Non quero pensar nunha man negra, mais pregúntome que está a pasar""o orixinalRaúl López, orgulloso dos xogadores, presume da boa saúde económica do BreogánJulio González confirma que cesa como presidente del BreogánHomenaxe a Lisardo GómezA tempada do rexurdimento celesteEntrevista a Lisardo GómezEl COB dinamita el Pazo para forzar el quinto (69-73)Cafés Candelas, patrocinador del CB Breogán"Suso Lázare, novo presidente do Breogán"o orixinalCafés Candelas Breogán firma el mayor triunfo de la historiaEl Breogán realizará 17 homenajes por su cincuenta aniversario"O Breogán honra ao seu fundador e primeiro presidente"o orixinalMiguel Giao recibiu a homenaxe do PazoHomenaxe aos primeiros gladiadores celestesO home que nos amosa como ver o Breo co corazónTita Franco será homenaxeada polos #50anosdeBreoJulio Vila recibirá unha homenaxe in memoriam polos #50anosdeBreo"O Breogán homenaxeará aos seus aboados máis veteráns"Pechada ovación a «Capi» Sanmartín e Ricardo «Corazón de González»Homenaxe por décadas de informaciónPaco García volve ao Pazo con motivo do 50 aniversario"Resultados y clasificaciones""O Cafés Candelas Breogán, campión da Copa Princesa""O Cafés Candelas Breogán, equipo ACB"C.B. Breogán"Proxecto social"o orixinal"Centros asociados"o orixinalFicha en imdb.comMario Camus trata la recuperación del amor en 'La vieja música', su última película"Páxina web oficial""Club Baloncesto Breogán""C. B. Breogán S.A.D."eehttp://www.fegaba.com

                              Vilaño, A Laracha Índice Patrimonio | Lugares e parroquias | Véxase tamén | Menú de navegación43°14′52″N 8°36′03″O / 43.24775, -8.60070

                              Cegueira Índice Epidemioloxía | Deficiencia visual | Tipos de cegueira | Principais causas de cegueira | Tratamento | Técnicas de adaptación e axudas | Vida dos cegos | Primeiros auxilios | Crenzas respecto das persoas cegas | Crenzas das persoas cegas | O neno deficiente visual | Aspectos psicolóxicos da cegueira | Notas | Véxase tamén | Menú de navegación54.054.154.436928256blindnessDicionario da Real Academia GalegaPortal das Palabras"International Standards: Visual Standards — Aspects and Ranges of Vision Loss with Emphasis on Population Surveys.""Visual impairment and blindness""Presentan un plan para previr a cegueira"o orixinalACCDV Associació Catalana de Cecs i Disminuïts Visuals - PMFTrachoma"Effect of gene therapy on visual function in Leber's congenital amaurosis"1844137110.1056/NEJMoa0802268Cans guía - os mellores amigos dos cegosArquivadoEscola de cans guía para cegos en Mortágua, PortugalArquivado"Tecnología para ciegos y deficientes visuales. Recopilación de recursos gratuitos en la Red""Colorino""‘COL.diesis’, escuchar los sonidos del color""COL.diesis: Transforming Colour into Melody and Implementing the Result in a Colour Sensor Device"o orixinal"Sistema de desarrollo de sinestesia color-sonido para invidentes utilizando un protocolo de audio""Enseñanza táctil - geometría y color. Juegos didácticos para niños ciegos y videntes""Sistema Constanz"L'ocupació laboral dels cecs a l'Estat espanyol està pràcticament equiparada a la de les persones amb visió, entrevista amb Pedro ZuritaONCE (Organización Nacional de Cegos de España)Prevención da cegueiraDescrición de deficiencias visuais (Disc@pnet)Braillín, un boneco atractivo para calquera neno, con ou sen discapacidade, que permite familiarizarse co sistema de escritura e lectura brailleAxudas Técnicas36838ID00897494007150-90057129528256DOID:1432HP:0000618D001766C10.597.751.941.162C97109C0155020