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=
prog.cpp: In function ‘int main()’:
prog.cpp:21:24: error: no matching function for call to ‘butNotWhenTemplated(item<int>&)’
butNotWhenTemplated(i);
^
prog.cpp:8:6: note: candidate: ‘template<class T> void butNotWhenTemplated(const item<const T>&)’
void butNotWhenTemplated (const item<const T> &) { }
^~~~~~~~~~~~~~~~~~~
prog.cpp:8:6: note: template argument deduction/substitution failed:
prog.cpp:21:24: note: types ‘const T’ and ‘int’ have incompatible cv-qualifiers
butNotWhenTemplated(i);
^