c – 使用非const指针调用函数通过指向const的指针函数解析为模板函数

前端之家收集整理的这篇文章主要介绍了c – 使用非const指针调用函数通过指向const的指针函数解析为模板函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下代码是在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节.

猜你在找的C&C++相关文章