#include<type_traits> using namespace std; template<typename T> struct M{ /*explicit*/ M(const T*){} }; template<typename T> M<T> f(const M<T>&){return M<T>();} int main() { M<char> s1=f<char>("Hello");//OK M<char> s2=f("Hello");//error M<char> s3=f(decay<char*>("Hello"));//error return 0; }
在main函数里面,只有s1这个构造是OK的(当然假如M里面加上了explicit关键字的话,也不行), 通过隐式类型转换构造成功。
但是后面两个s2/s3,当本人使用模板函数f而没有显示指定模板实例化类型的时候,两个都编译不过,本人尝试了decay<char*>也不行。
这是为什么呢,背后的机理是?
谢谢
20
char* / const char * 和 const M<T>& ,无法推导出 T 的类型。(此时类型转换是不考虑的)
20
T 可以代表任何类型,但是你的参数类型并不是 T ,而是 const M<T>& 。无论 T 是什么类型, const M<T>& 都不是 char * 。
60
你这个是在模板参数推导的是后败掉的。
char* / const char * 和 const M<T>& ,无法推导出 T 的类型。(此时类型转换是不考虑的)既然模板里面的T代表任意类型,那么为什么const char*不能推导给const M<T>?
还是不太明白。T 可以代表任何类型,但是你的参数类型并不是 T ,而是 const M<T>& 。无论 T 是什么类型, const M<T>& 都不是 char * 。
那么,本人现在把main函数改成了下面这样:
int main() { M<char> s1=f<char>("Hello");//OK const char* p="hello"; M<char> s2=f(p);//error M<char> s3=f(decay<const char*>("Hello"));//error return 0; }编译还是s2/s3不通过啊。现在本人都改成了const char*作为实参了,为什么模板还是推导不出来呢?
你这个是在模板参数推导的是后败掉的。
char* / const char * 和 const M<T>& ,无法推导出 T 的类型。(此时类型转换是不考虑的)既然模板里面的T代表任意类型,那么为什么const char*不能推导给const M<T>?
还是不太明白。T 可以代表任何类型,但是你的参数类型并不是 T ,而是 const M<T>& 。无论 T 是什么类型, const M<T>& 都不是 char * 。
那么,本人现在把main函数改成了下面这样:
int main() { M<char> s1=f<char>("Hello");//OK const char* p="hello"; M<char> s2=f(p);//error M<char> s3=f(decay<const char*>("Hello"));//error return 0; }编译还是s2/s3不通过啊。现在本人都改成了const char*作为实参了,为什么模板还是推导不出来呢?
const char * 和 const M<T> & 也不是一回事啊 ….