Just use decltype(auto)
:
namespace ns1
{
template<class T>
constexpr decltype(auto) foo(T const& v)
{
return v.bar();
}
}
template<class T>
class S1
{
void bar() const
{
}
friend constexpr decltype(auto) ns1::foo<S1>(S1 const& c);
};