#include <utility>
#include <type_traits>

struct B;

struct A {
    void operator *(const B &) {}
};
struct B {
    void operator *(int x) const {}
};

inline void operator *(int a, const B & b) {
    return b * a;
}

template <typename T, typename C = std::remove_reference<decltype(std::declval<T>)>::type> T & f(C c = C()) {
    return c;
}

int main() {
    
    f<A>();
    
}