template <typename T> struct item {
operator item<const T> () const { return item<const T>(); }
};
void conversionToConstRefWorks (const item<const int> &) { }
template <typename T>
void butNotWhenTemplated (const item<const T> &) { }
int main () {
item<int> i;
item<const int> ci;
// these all compile fine:
conversionToConstRefWorks(ci);
conversionToConstRefWorks(i);
butNotWhenTemplated(ci);
// but this one fails:
butNotWhenTemplated(i);
}
dGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpdGVtIHsKICBvcGVyYXRvciBpdGVtPGNvbnN0IFQ+ICgpIGNvbnN0IHsgcmV0dXJuIGl0ZW08Y29uc3QgVD4oKTsgfQp9OwoKdm9pZCBjb252ZXJzaW9uVG9Db25zdFJlZldvcmtzIChjb25zdCBpdGVtPGNvbnN0IGludD4gJikgeyB9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gCnZvaWQgYnV0Tm90V2hlblRlbXBsYXRlZCAoY29uc3QgaXRlbTxjb25zdCBUPiAmKSB7IH0KCmludCBtYWluICgpIHsKCiAgaXRlbTxpbnQ+IGk7CiAgaXRlbTxjb25zdCBpbnQ+IGNpOwoKICAvLyB0aGVzZSBhbGwgY29tcGlsZSBmaW5lOgogIGNvbnZlcnNpb25Ub0NvbnN0UmVmV29ya3MoY2kpOwogIGNvbnZlcnNpb25Ub0NvbnN0UmVmV29ya3MoaSk7CiAgYnV0Tm90V2hlblRlbXBsYXRlZChjaSk7CgogIC8vIGJ1dCB0aGlzIG9uZSBmYWlsczoKICBidXROb3RXaGVuVGVtcGxhdGVkKGkpOyAKCn0=