为何长度相同的C风格字符串传入模板函数可通过编译?
问题原因解析
首先要明确字符串字面量的实际类型:像 "abc" 这样的字符串字面量,它的类型是 const char[4]——这里的长度4包含了字符串末尾的终止符 '\0'。
回到你的模板函数:
template <typename T> int compare(T& x, T& y) { return 1; }
当你调用 compare("abc", "abc") 时,两个实参的类型完全一致(都是 const char[4]),模板参数推导会直接将 T 推导为 const char[4],此时函数的参数类型就是 const char (&)[4](对数组的引用)。
因为两个实参的类型和推导后的参数类型完全匹配,不需要进行任何你提到的两种转换,所以模板推导成功,程序可以正常编译。
如果传入长度不同的字符串字面量,比如 compare("abc", "abcd"),两者的类型分别是 const char[4] 和 const char[5],此时模板无法推导出一个统一的 T 来匹配两个参数,才会触发编译错误。
内容的提问来源于stack exchange,提问作者Amir Mokhammed-Ali
相关产品推荐
相关产品推荐

