C++ 为什么这段代码在GCC中调用通用模板函数?
我的问题是:为什么不直观地输出“特殊字符”?,因为数组的维度不是其类型的一部分。这个维度只对变量和字段重要。所以两者都是C++ 为什么这段代码在GCC中调用通用模板函数?,c++,C++,我的问题是:为什么不直观地输出“特殊字符”?,因为数组的维度不是其类型的一部分。这个维度只对变量和字段重要。所以两者都是 Common_T 及 具有相同的类型char[] 及 及 是“相同”类型的别名 (您可以查看以获得线索)直观地看,因为数组的维度不是其类型的一部分。这个维度只对变量和字段重要。所以两者都是 Common_T 及 具有相同的类型char[] 及 及 是“相同”类型的别名 (您可以查看以获得线索)这是与您的c字符串匹配的正确模板专用化 typedef char t2[];
Common_T
及
具有相同的类型char[]
及
及
是“相同”类型的别名
(您可以查看以获得线索)直观地看,因为数组的维度不是其类型的一部分。这个维度只对变量和字段重要。所以两者都是
Common_T
及
具有相同的类型char[]
及
及
是“相同”类型的别名
(您可以查看以获得线索)这是与您的c字符串匹配的正确模板专用化
typedef char t2[];
typedef char6[6];
模板整数比较(char6常量和s1,char6常量和s2)
{
cout这是与c字符串匹配的正确模板专门化
typedef char t2[];
typedef char6[6];
模板整数比较(char6常量和s1,char6常量和s2)
{
当您将代码更改为inti=compare(“hello”,5)时,您会得到什么
?编译错误是肯定的。但我认为参数类型将包含在诊断消息中,因此这可能会回答您的问题。VC2010输出特殊字符6但为什么VC2010输出特殊字符6 T?@hu wang:或者为什么gcc不输出?我还不知道。有趣的是,如果从typedef中删除const(typedef Char6[6];)然后GCC也会输出特殊的字符6。似乎这是与(可能的)“双常量”与typedef一起崩溃有关的一些微妙的事情。在C++2011中,它是typedef std::array Char6
的一个很好的用例,当您将代码更改为int i=compare(“hello”,5)时,您会得到什么
?编译错误是肯定的。但我认为参数类型将包含在诊断消息中,因此这可能会回答您的问题。VC2010输出特殊字符6但为什么VC2010输出特殊字符6 T?@hu wang:或者为什么gcc不输出?我还不知道。有趣的是,如果从typedef中删除const(typedef Char6[6];)然后GCC也会输出特殊的字符6。似乎这是与(可能的)“双常量”用typedef崩溃有关的一些微妙的事情。在C++2011中,这是typedef std::array Char6
@Mehrdad read from right to left“s1是对常量“Char6 type”的引用,它扩展为“s1是对大小为6的常量字符数组的引用”的一个很好的用例哦……我以为这是一个变量声明;我没有看到typedef
!!对此非常抱歉。@huwang无法将赋值中的'const char[6]'转换为'main()::wtf'是我执行enum wtf{};wtf lol;lol=“hello”时得到的结果;是的,根据gcc,它是一个常量字符数组,符合标准。@Mehrdad read from right to left“s1是对常量“char6 type”的引用,它扩展为“s1是对大小为6的常量字符数组的引用”哦……我以为这是一个变量声明;我没有看到typedef
!!对此非常抱歉。@huwang无法将赋值中的'const char[6]'转换为'main()::wtf'是我执行enum wtf{};wtf lol;lol=“hello”时得到的结果是的,根据gcc,它是一个常量字符数组,符合标准。你的直觉是错误的。数组绑定肯定是它类型的一部分。这就是为什么sizeof(t1)
是6。如果数组绑定不是类型的一部分,sizeof
无法推断出它。@MSalters:我同意你的观点sizeof
不是类型的一部分;否则是char*
参数和char[]
formal不适合。它们肯定有不同的sizeof
@basiletarynkevitch:What’t NOT fit?(不适合)是什么意思?另外,请注意,示例中的longstring
的类型不是char[]
。这只是一个简写声明。编译器会将类型推断为char[39]
从其初始值的长度。以put
为例:您可以使用参数const char hello[]=“hello”
调用它,其sizeof
为6或const char*p=strdup(“foobarbarbar”);
其sizeof
为sizeof(void*)
ie 8在64位机器上。因此sizeof
不是参数类型的一部分。你的直觉是错误的。数组绑定肯定是其类型的一部分。这就是为什么sizeof(t1)
是6。如果数组绑定不是类型的一部分,sizeof
无法推断出它。@MSalters:我同意你的观点sizeof
不是类型的一部分;否则是char*
参数和char[]
formal不适合。它们肯定有不同的sizeof
@basiletarynkevitch:What’t NOT fit?(不适合)是什么意思?另外,请注意,示例中的longstring
的类型不是char[]
。这只是一个简写声明。编译器会将类型推断为char[39]
从其初始值的长度。以put
为例:您可以使用参数const char hello[]=“hello”
调用它,其sizeof
为6或const char*p=strdup(“foobarbarbar”);
其sizeof
为sizeof(void*)
ie 8在64位机器上。因此sizeof
不是参数类型的一部分。
typedef char t1[6];
typedef char t2[];
typedef char char6[6];
template<> int compare<char6>(char6 const &s1,char6 const &s2)
{
cout << "Special_Char6_T" << endl;
return 0;
}