#include <type_traits>
template <typename T>
struct Ref
{
T &t;
Ref(T &_t) : t(_t) {}
Ref(const Ref<typename std::remove_cv<T>::type>& other) : t(other.t) {}
};
template <typename T>
Ref<T> MakeRef(T& t) { return {t}; }
template <typename T>
Ref<const T> MakeConstRef(const T& t) { return {t}; }
int main()
{
int foo = 5;
auto r = MakeConstRef(foo);
auto c = r; //This should be allowed.
auto other = MakeRef(foo); //This should also be allowed.
Ref<const int> baz = other; // This should work, too.
Ref<int> bar = c; //This should fail to compile somehow.
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBSZWYKewogICAgVCAmdDsKICAgIFJlZihUICZfdCkgOiB0KF90KSB7fQogICAgUmVmKGNvbnN0IFJlZjx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jdjxUPjo6dHlwZT4mIG90aGVyKSA6IHQob3RoZXIudCkge30KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpSZWY8VD4gTWFrZVJlZihUJiB0KSB7IHJldHVybiB7dH07IH0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpSZWY8Y29uc3QgVD4gTWFrZUNvbnN0UmVmKGNvbnN0IFQmIHQpIHsgcmV0dXJuIHt0fTsgfQoKaW50IG1haW4oKQp7CiAgICBpbnQgZm9vID0gNTsKICAgIGF1dG8gciA9IE1ha2VDb25zdFJlZihmb28pOwogICAgYXV0byBjID0gcjsgICAgICAgICAgICAvL1RoaXMgc2hvdWxkIGJlIGFsbG93ZWQuCiAgICBhdXRvIG90aGVyID0gTWFrZVJlZihmb28pOyAgLy9UaGlzIHNob3VsZCBhbHNvIGJlIGFsbG93ZWQuCiAgICBSZWY8Y29uc3QgaW50PiBiYXogPSBvdGhlcjsgIC8vIFRoaXMgc2hvdWxkIHdvcmssIHRvby4KICAgIFJlZjxpbnQ+IGJhciA9IGM7ICAgICAgICAgICAgICAgIC8vVGhpcyBzaG91bGQgZmFpbCB0byBjb21waWxlIHNvbWVob3cuCn0K