#include <iostream>
template<typename T>
class X {
public:
X(T t) {}
friend void func(const X& lhs, const X& rhs) {}
};
template <typename T> X<T> asX(const T& t) { return {t}; }
template <typename T> const X<T>& asX(const X<T>& x) { return x; }
template<typename LHS, typename RHS>
void func(const LHS& lhs, const RHS& rhs) { return func(asX(lhs), asX(rhs)); }
int main() {
X<int> x1(42);
X<int> x2(51);
func(42, 24);
func(x1, 24);
func(x1, x2);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgWCB7CnB1YmxpYzoKICAgICBYKFQgdCkge30KICAgIGZyaWVuZCB2b2lkIGZ1bmMoY29uc3QgWCYgbGhzLCBjb25zdCBYJiByaHMpIHt9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gWDxUPiBhc1goY29uc3QgVCYgdCkgeyByZXR1cm4ge3R9OyB9CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjb25zdCBYPFQ+JiBhc1goY29uc3QgWDxUPiYgeCkgeyByZXR1cm4geDsgfQoKdGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CnZvaWQgZnVuYyhjb25zdCBMSFMmIGxocywgY29uc3QgUkhTJiByaHMpIHsgcmV0dXJuIGZ1bmMoYXNYKGxocyksIGFzWChyaHMpKTsgfQoKCmludCBtYWluKCkgewoJWDxpbnQ+IHgxKDQyKTsKCVg8aW50PiB4Mig1MSk7CgoJZnVuYyg0MiwgMjQpOwoJZnVuYyh4MSwgMjQpOwoJZnVuYyh4MSwgeDIpOwoKCn0=