#include namespace detail { template struct Quux {}; } // namespace detail using FuncPtr = detail::Quux (*(*)(int))(float); struct Foo { template void foo(T const &t) const noexcept(true) {} template void operator<<(size_t) {} template FuncPtr returns_func_ptr(detail::Quux &&) const noexcept(false) { return nullptr; } }; namespace ns { template int foo(T const &t) noexcept(false) { return 0; } template FuncPtr returns_func_ptr(detail::Quux &&) { return nullptr; } } // namespace ns int bar() { return 1; } namespace { int anon_bar() { return 1; } auto anon_lambda = [](std::function) mutable {}; } // namespace int main() { ns::foo(bar); ns::foo(std::function{bar}); ns::foo(anon_lambda); ns::foo(std::function{anon_bar}); ns::foo(&Foo::foo>); ns::returns_func_ptr(detail::Quux{}); Foo f; f.foo(std::function{bar}); f.foo(std::function{anon_bar}); f.operator<< <(2 > 1)>(0); f.returns_func_ptr(detail::Quux{}); return 0; }