以下代码是在g 4.1.2和g 4.4.4上编译的.两者都给出了评论中指出的结果.
int f(const int * a) { return 0; } template<typename A> int f(A a) { return 1; } int main() { int x; // return f(&x); // returns 1 return f((const int *)&x); // returns 0 }
它似乎归结为调用f(int *)解析为f< int *>(int *)而不是预期的f(const int *).我发现这令人震惊,完全不直观.
这是g中的一个错误,是C的一个黑暗角落,还是由于某种原因我很遗憾?如果它不是一个错误,它背后的理论或逻辑是什么?有关此问题的安全措施吗?
解决方法
对于实例化的模板f< int *>不需要转换(int * – > const int *),所以它是一个更好的匹配 – 实际上,它是一个完全匹配,只会对非模板化的精确匹配失去,这就是第二次调用所发生的情况.
有关“更好匹配”规则的完整说明,请参见C标准的第13.3.3节.