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