隐式类型转换编译失败, 帮本人看看是什么错误

C++语言 码拜 8年前 (2016-04-06) 1074次浏览
本人本人写了一小段代码:

#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

引用:
Quote: 引用:

你这个是在模板参数推导的是后败掉的。
char* / const char * 和 const M<T>& ,无法推导出 T 的类型。(此时类型转换是不考虑的)

既然模板里面的T代表任意类型,那么为什么const char*不能推导给const M<T>?
还是不太明白。

T 可以代表任何类型,但是你的参数类型并不是 T ,而是 const M<T>& 。无论 T 是什么类型, const M<T>& 都不是 char * 。

60

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

你这个是在模板参数推导的是后败掉的。
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*作为实参了,为什么模板还是推导不出来呢?

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

你这个是在模板参数推导的是后败掉的。
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> & 也不是一回事啊 ….


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明隐式类型转换编译失败, 帮本人看看是什么错误
喜欢 (0)
[1034331897@qq.com]
分享 (0)