#include <iostream>
#include <type_traits>
using namespace std;
template <typename T>
T rvalue() { return T(); }
template <typename T>
T& lvalue() { static T t; return t; }
int main() {
cout << is_assignable<double, int>::value;
cout << is_assignable<double, int&>::value;
cout << is_assignable<double&, int>::value;
cout << is_assignable<double&, int&>::value;
// rvalue<double>() = rvalue<int>(); // Doesn't compile
// rvalue<double>() = lvalue<int>(); // Doesn't compile
lvalue<double>() = rvalue<int>(); // OK
lvalue<double>() = lvalue<int>(); // OK
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ClQgcnZhbHVlKCkgeyByZXR1cm4gVCgpOyB9CiAKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ClQmIGx2YWx1ZSgpIHsgc3RhdGljIFQgdDsgcmV0dXJuIHQ7IH0KIAppbnQgbWFpbigpIHsKCWNvdXQgPDwgaXNfYXNzaWduYWJsZTxkb3VibGUsIGludD46OnZhbHVlOwoJY291dCA8PCBpc19hc3NpZ25hYmxlPGRvdWJsZSwgaW50Jj46OnZhbHVlOwoJY291dCA8PCBpc19hc3NpZ25hYmxlPGRvdWJsZSYsIGludD46OnZhbHVlOwoJY291dCA8PCBpc19hc3NpZ25hYmxlPGRvdWJsZSYsIGludCY+Ojp2YWx1ZTsKIAogICAgLy8gcnZhbHVlPGRvdWJsZT4oKSA9IHJ2YWx1ZTxpbnQ+KCk7IC8vIERvZXNuJ3QgY29tcGlsZQogICAgLy8gcnZhbHVlPGRvdWJsZT4oKSA9IGx2YWx1ZTxpbnQ+KCk7IC8vIERvZXNuJ3QgY29tcGlsZQogICAgbHZhbHVlPGRvdWJsZT4oKSA9IHJ2YWx1ZTxpbnQ+KCk7IC8vIE9LCiAgICBsdmFsdWU8ZG91YmxlPigpID0gbHZhbHVlPGludD4oKTsgLy8gT0sKCXJldHVybiAwOwp9Cg==