我写了一小段代码:
#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;
}
首先,s1
编译成功了。但如果我将M::M
改为explicit,则会编译失败。而无论我在s3
上使用decay<char*>
,s2
和s3
都无法编译通过。
问题出在是否为f
指定了模板初始化参数类型。为什么s2
和s3
无法编译通过?这在C++标准中有何原则?
如果我将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
的情况下,由于函数参数是const char[6]
,编译器如何得出模板参数必须是char
的结论。另外,你的衰减是错误的。const char[6]
会衰减为const char *
,而不是char *
。 - Sam Varshavchik