c – 为什么第一个函数调用绑定到第一个函数?
参见英文答案 >
Why does pointer decay take priority over a deduced template?1
为什么第一个函数调用(cm(car);)绑定到第一个函数? 我明白,第二次调用是第二个函数,因为它是非模板,尽管是完美的匹配. 如果第一个函数被定义为具有固定数组长度的非模板,则为: void cm(const char (&h)[8]) {cout << "const char (&)[8]" << endl;} 比再次被选中的第二个(第二个调用将是模糊的那种方式). 码: template<size_t N> void cm(const char (&h)[N]) {std::cout << " const (&)[N] " << endl;} void cm(const char * h) {cout << " const char * " << endl;} int main() { char car[] = "errqweq"; const char ccar[] = "errqweq"; cm(car); cm(ccar); } 输出: const (&)[N] const char * 解决方法
第一个调用选择功能模板专门化 – 因为它是一个更好的匹配.
让我们标记两个重载: template<size_t N> void cm(const char (&h)[N]) // (1) - the specialization {std::cout << " const (&)[N] " << endl;} void cm(const char * h) // (2) {cout << " const char * " << endl;} 对于(1),汽车绑定到参考.这是一个身份转换1.
数组到指针的转换是一个Lvalue Transformation,所以在这里不会被考虑 – 就像第二个例子一样.资格转换有自己的类别:资格调整.因此,转换为(1)的参数是转换为(2)参数的子序列:第一个是身份转换,第二个是资格转换,根据上述段落,身份转换是任何非身份转换.所以选择(1). 正如你已经提到过的,在第二种情况下,转换同样好;上述引用不起作用,因为转换为(2)s参数不是转换为(1)的参数的子序列.因此,[over.match.best] / 1适用.
所以(2)选择一个.如果函数模板不是模板,而是具有参数char const(&)[8]的函数,那么调用将是不明确的as Clang correctly says. 1 [over.ics.ref] / 1:
[dcl.init.ref] / 5(在8.5.3中):
2 [conv.array]:
T可以是cv合格的,所以被指派的类型也是.这里T只是char,所以指针的类型指向char =>字符*. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |