http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56874



             Bug #: 56874

           Summary: Argument deduction failure with lambda and default

                    template argument

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Keywords: rejects-valid

          Severity: normal

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: r...@gcc.gnu.org

                CC: ja...@gcc.gnu.org





I believe the following code, based on the std::function implementation in

libstdc++, should compile:



template<typename T>

T declval();



template<typename T>

struct function

{

  template<typename F, typename = decltype(declval<F&>() ())>

    function(F)

    { }

};



struct V {

  typedef int value_type;

};



template <typename C>

void map(C&, function<typename C::value_type>)

{

}



int main()

{

  V v;

  map(v, []() { });

}





f.cc: In function 'int main()':

f.cc:24:18: error: no matching function for call to 'map(V&,

main()::__lambda0)'

   map(v, []() { });

                  ^

f.cc:24:18: note: candidate is:

f.cc:17:6: note: template<class C> void map(C&, function<typename

C::value_type>)

 void map(C&, function<typename C::value_type>)

      ^

f.cc:17:6: note:   template argument deduction/substitution failed:

f.cc:24:18: note:   'main()::__lambda0' is not derived from 'function<typename

C::value_type>'

   map(v, []() { });

                  ^



This modified version compiles OK, but whether we say function<int> or

function<typename C::value_type> should not affect deduction of F from the

lambda:



template<typename T>

T declval();



template<typename T>

struct function

{

  template<typename F, typename = decltype(declval<F&>() ())>

    function(F)

    { }

};



struct V {

  typedef int value_type;

};



template <typename C>

void map(C&, function<int>)

{

}



int main()

{

  V v;

  map(v, []() { });

}

Reply via email to