1- #include < functional>
2-
31namespace detail {
42template <typename T> struct Quux {};
53} // namespace detail
64
75using FuncPtr = detail::Quux<double > (*(*)(int ))(float );
86
97struct Foo {
10- template <typename T> void foo (T const &t ) const noexcept (true ) {}
8+ template <typename T> void foo (T arg ) const noexcept (true ) {}
119
12- template <size_t T> void operator <<(size_t ) {}
10+ template <int T> void operator <<(int ) {}
1311
1412 template <typename T> FuncPtr returns_func_ptr (detail::Quux<int > &&) const noexcept (false ) { return nullptr ; }
1513};
1614
1715namespace ns {
18- template <typename T> int foo (T const &t) noexcept (false ) { return 0 ; }
16+ template <typename T> int foo (char const *str) noexcept (false ) { return 0 ; }
17+ template <typename T> int foo (T t) { return 1 ; }
1918
2019template <typename T> FuncPtr returns_func_ptr (detail::Quux<int > &&) { return nullptr ; }
2120} // namespace ns
@@ -24,20 +23,20 @@ int bar() { return 1; }
2423
2524namespace {
2625int anon_bar () { return 1 ; }
27- auto anon_lambda = [](std::function< int ( int (*)( int ))>) mutable {};
26+ auto anon_lambda = [] {};
2827} // namespace
2928
3029int main () {
31- ns::foo (bar);
32- ns::foo (std::function{ bar} );
30+ ns::foo< decltype (bar)> (bar);
31+ ns::foo< decltype ( bar)>( " bar " );
3332 ns::foo (anon_lambda);
34- ns::foo (std::function{ anon_bar} );
35- ns::foo (&Foo::foo<std::function< int (int )>> );
33+ ns::foo (anon_bar);
34+ ns::foo< decltype (&Foo::foo<int (int )>)>( " method " );
3635 ns::returns_func_ptr<int >(detail::Quux<int >{});
3736 Foo f;
38- f.foo (std::function{bar});
39- f.foo (std::function{anon_bar});
37+ f.foo (anon_bar);
4038 f.operator << <(2 > 1 )>(0 );
4139 f.returns_func_ptr <int >(detail::Quux<int >{});
40+
4241 return 0 ;
4342}
0 commit comments