49 lines · cpp
1namespace detail {2template <typename T> struct Quux {};3} // namespace detail4 5using FuncPtr = detail::Quux<double> (*(*)(int))(float);6 7struct Foo {8 template <typename T> void foo(T arg) const noexcept(true) {}9 10 template <int T> void operator<<(int) {}11 12 template <typename T> FuncPtr returns_func_ptr(detail::Quux<int> &&) const noexcept(false) { return nullptr; }13};14 15namespace ns {16template <typename T> int foo(char const *str) noexcept(false) { return 0; }17template <typename T> int foo(T t) { return 1; }18 19template <typename T> FuncPtr returns_func_ptr(detail::Quux<int> &&) { return nullptr; }20} // namespace ns21 22int bar() { return 1; }23 24namespace {25int anon_bar() { return 1; }26auto anon_lambda = [] {};27} // namespace28 29__attribute__((always_inline)) int inlined_foo(const char *str) {30 if (bool b = bar())31 return 1;32 return 2;33}34 35int main() {36 ns::foo<decltype(bar)>(bar);37 ns::foo<decltype(bar)>("bar");38 ns::foo(anon_lambda);39 ns::foo(anon_bar);40 ns::foo<decltype(&Foo::foo<int(int)>)>("method");41 ns::returns_func_ptr<int>(detail::Quux<int>{});42 Foo f;43 f.foo(anon_bar);44 f.operator<< <(2 > 1)>(0);45 f.returns_func_ptr<int>(detail::Quux<int>{});46 inlined_foo("bar");47 return 0;48}49