1 // PR c++/71117 2 // { dg-do compile { target c++14 } } 3 4 template <class T> T&& declval() noexcept; 5 template <class, class> 6 constexpr bool is_same = false; 7 template <class T> 8 constexpr bool is_same<T, T> = true; 9 10 template <class F> 11 struct indirected : F { indirectedindirected12 indirected(F f) : F(f) {} 13 template <class I> 14 auto operator()(I i) -> decltype(declval<F&>()(*i)) { 15 return static_cast<F&>(*this)(*i); 16 } 17 }; 18 main()19int main() { 20 auto f = [](auto rng) { 21 static_assert(is_same<decltype(rng), int>, ""); 22 return 42; 23 }; 24 indirected<decltype(f)> i(f); 25 static_assert(is_same<decltype(i(declval<int*>())), int>, ""); 26 } 27