Lambda functions with template parameters, not in function parametersWhat is a lambda (function)?How do I test a private function or a class that has private methods, fields or inner classes?Why can templates only be implemented in the header file?Where and why do I have to put the “template” and “typename” keywords?Distinct() with lambda?Can lambda functions be templated?What is a lambda expression in C++11?Replacing a 32-bit loop counter with 64-bit introduces crazy performance deviations

What happens to a net with the Returning Weapon artificer infusion after it hits?

How much horsepower to weight is required for a 1:1 thrust ratio

What is Weapon Handling?

Why Italian monolingual dictionaries usually take complex/archaic examples from books instead of creating simple examples?

Another student has been assigned the same MSc thesis as mine (and already defended)

Top off gas with old oil, is that bad?

Convert a string of digits from words to an integer

Lost passport which have valid student visa but I make new passport unable paste

Whaling ship logistics

"I will not" or "I don't" as an answer for negative orders?

Why isn't there armor to protect from spells in the Potterverse?

Do interval ratios take overtones into account or solely the fundamental frequency?

Received a package but didn't order it

Problematic Nature of Views

Why aren't faces sharp in my f/1.8 portraits even though I'm carefully using center-point autofocus?

Does variance make sense in a fully immutable language?

Delete n lines skip 1 line script

Why does Captain Marvel in the MCU not have her sash?

Would an object shot from earth fall into the sun?

Can I exile my opponent's Progenitus/True-Name Nemesis with Teferi, Hero of Dominaria's emblem?

How To: Refresh environment A(QA) from environment B(Prod) after they're out of sync

An impressive body of work

Fix Ethernet 10/100 PoE cable with 7 out of 8 wires alive

London Congestion Charge on A205



Lambda functions with template parameters, not in function parameters


What is a lambda (function)?How do I test a private function or a class that has private methods, fields or inner classes?Why can templates only be implemented in the header file?Where and why do I have to put the “template” and “typename” keywords?Distinct() with lambda?Can lambda functions be templated?What is a lambda expression in C++11?Replacing a 32-bit loop counter with 64-bit introduces crazy performance deviations






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








6















Why does the first call not compile?



auto get1 = []<int B>() return B; ;
auto get2 = []<typename B>(B b) return b; ;

int main()

get1<5>(); // error: no match for operator<
get2(5); // ok



The reason I use this, is an expression repeated many times in code.



Of course I can use a real function function, but just I am curious WHY.










share|improve this question
































    6















    Why does the first call not compile?



    auto get1 = []<int B>() return B; ;
    auto get2 = []<typename B>(B b) return b; ;

    int main()

    get1<5>(); // error: no match for operator<
    get2(5); // ok



    The reason I use this, is an expression repeated many times in code.



    Of course I can use a real function function, but just I am curious WHY.










    share|improve this question




























      6












      6








      6


      2






      Why does the first call not compile?



      auto get1 = []<int B>() return B; ;
      auto get2 = []<typename B>(B b) return b; ;

      int main()

      get1<5>(); // error: no match for operator<
      get2(5); // ok



      The reason I use this, is an expression repeated many times in code.



      Of course I can use a real function function, but just I am curious WHY.










      share|improve this question
















      Why does the first call not compile?



      auto get1 = []<int B>() return B; ;
      auto get2 = []<typename B>(B b) return b; ;

      int main()

      get1<5>(); // error: no match for operator<
      get2(5); // ok



      The reason I use this, is an expression repeated many times in code.



      Of course I can use a real function function, but just I am curious WHY.







      c++ templates lambda c++20






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 9 hours ago









      Barry

      200k22 gold badges375 silver badges669 bronze badges




      200k22 gold badges375 silver badges669 bronze badges










      asked 9 hours ago









      ChameleonChameleon

      6191 gold badge5 silver badges13 bronze badges




      6191 gold badge5 silver badges13 bronze badges

























          1 Answer
          1






          active

          oldest

          votes


















          10
















          This is easier to understand if you consider what the equivalent class type looks like to your get1:



          struct get1_t 
          template <int B> operator()() const return B;
          ;

          get1_t get1;

          get1<5>(); // error


          You're trying to provide an explicit template parameter to the call operator, but syntactically you're doing what looks like providing template parameters for get1 itself (i.e. as if get1 were a variable template). In order to provide the template parameter for the call operator, you have to do that directly:



          get1.operator()<5>(); // ok


          Or restructure the call operator to take something deducible:



          template <int B> struct constant ;
          get1(constant<5>);



          Or restructure the whole thing to actually be the variable template that it looks like it is:



          template <int B>
          auto get1 = [] return B; ;


          Now, get1<5> is itself a lambda, that you're invoking. That is, rather than a lambda with a call operator template we have a variable template lambda that is itself not a template.






          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/4.0/"u003ecc by-sa 4.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%2f58064451%2flambda-functions-with-template-parameters-not-in-function-parameters%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            10
















            This is easier to understand if you consider what the equivalent class type looks like to your get1:



            struct get1_t 
            template <int B> operator()() const return B;
            ;

            get1_t get1;

            get1<5>(); // error


            You're trying to provide an explicit template parameter to the call operator, but syntactically you're doing what looks like providing template parameters for get1 itself (i.e. as if get1 were a variable template). In order to provide the template parameter for the call operator, you have to do that directly:



            get1.operator()<5>(); // ok


            Or restructure the call operator to take something deducible:



            template <int B> struct constant ;
            get1(constant<5>);



            Or restructure the whole thing to actually be the variable template that it looks like it is:



            template <int B>
            auto get1 = [] return B; ;


            Now, get1<5> is itself a lambda, that you're invoking. That is, rather than a lambda with a call operator template we have a variable template lambda that is itself not a template.






            share|improve this answer































              10
















              This is easier to understand if you consider what the equivalent class type looks like to your get1:



              struct get1_t 
              template <int B> operator()() const return B;
              ;

              get1_t get1;

              get1<5>(); // error


              You're trying to provide an explicit template parameter to the call operator, but syntactically you're doing what looks like providing template parameters for get1 itself (i.e. as if get1 were a variable template). In order to provide the template parameter for the call operator, you have to do that directly:



              get1.operator()<5>(); // ok


              Or restructure the call operator to take something deducible:



              template <int B> struct constant ;
              get1(constant<5>);



              Or restructure the whole thing to actually be the variable template that it looks like it is:



              template <int B>
              auto get1 = [] return B; ;


              Now, get1<5> is itself a lambda, that you're invoking. That is, rather than a lambda with a call operator template we have a variable template lambda that is itself not a template.






              share|improve this answer





























                10














                10










                10









                This is easier to understand if you consider what the equivalent class type looks like to your get1:



                struct get1_t 
                template <int B> operator()() const return B;
                ;

                get1_t get1;

                get1<5>(); // error


                You're trying to provide an explicit template parameter to the call operator, but syntactically you're doing what looks like providing template parameters for get1 itself (i.e. as if get1 were a variable template). In order to provide the template parameter for the call operator, you have to do that directly:



                get1.operator()<5>(); // ok


                Or restructure the call operator to take something deducible:



                template <int B> struct constant ;
                get1(constant<5>);



                Or restructure the whole thing to actually be the variable template that it looks like it is:



                template <int B>
                auto get1 = [] return B; ;


                Now, get1<5> is itself a lambda, that you're invoking. That is, rather than a lambda with a call operator template we have a variable template lambda that is itself not a template.






                share|improve this answer















                This is easier to understand if you consider what the equivalent class type looks like to your get1:



                struct get1_t 
                template <int B> operator()() const return B;
                ;

                get1_t get1;

                get1<5>(); // error


                You're trying to provide an explicit template parameter to the call operator, but syntactically you're doing what looks like providing template parameters for get1 itself (i.e. as if get1 were a variable template). In order to provide the template parameter for the call operator, you have to do that directly:



                get1.operator()<5>(); // ok


                Or restructure the call operator to take something deducible:



                template <int B> struct constant ;
                get1(constant<5>);



                Or restructure the whole thing to actually be the variable template that it looks like it is:



                template <int B>
                auto get1 = [] return B; ;


                Now, get1<5> is itself a lambda, that you're invoking. That is, rather than a lambda with a call operator template we have a variable template lambda that is itself not a template.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited 8 hours ago









                T.C.

                111k14 gold badges229 silver badges338 bronze badges




                111k14 gold badges229 silver badges338 bronze badges










                answered 9 hours ago









                BarryBarry

                200k22 gold badges375 silver badges669 bronze badges




                200k22 gold badges375 silver badges669 bronze badges

































                    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%2f58064451%2flambda-functions-with-template-parameters-not-in-function-parameters%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