gpt4 book ai didi

c++ - 使用非 const 指针调用函数比使用指向 const 的指针的函数更像是一个模板函数

转载 作者:可可西里 更新时间:2023-11-01 18:25:55 25 4
gpt4 key购买 nike

以下代码是在 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++ - 使用非 const 指针调用函数比使用指向 const 的指针的函数更像是一个模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6461858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com