1 // PR c++/64227
2 // { dg-do compile { target c++14 } }
3 
4 template<typename T>
5 struct remove_reference
6 { typedef T   type; };
7 
8 template<typename T>
9 struct remove_reference<T&>
10 { typedef T   type; };
11 
12 template<typename T>
13 struct remove_reference<T&&>
14 { typedef T   type; };
15 
16 template<typename T>
17 constexpr T&&
18 forward(typename remove_reference<T>::type& t) noexcept
19 { return static_cast<T&&>(t); }
20 
21 template<typename T>
22 constexpr T&&
23 forward(typename remove_reference<T>::type&& t) noexcept
24 { return static_cast<T&&>(t); }
25 
26 template<typename T>
27 auto greater_than(T&& t)
28 {
29   return [val = forward<T&&>(t)] (const auto& arg) { return arg > val; };
30 }
31 
32 template<typename Functor>
33 void g(Functor f)
34 {
35   for (int i = 0; i < 100000; i++)
36     f(i);
37 }
38 
39 int main()
40 {
41   g(greater_than(10));
42 }
43