【发布时间】:2011-06-23 23:35:02
【问题描述】:
以下代码是在 g++ 4.1.2 和 g++ 4.4.4 上编译的。两者都给出了 cmets 中记录的结果。
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)和f(const int)就 ANSI c++ 编译器而言是相同的原型 -
对,但是
f(int *)和f(const int *)/f(int const *)不一样 -
+1 用于提供最小、完整的示例程序。请参阅 sscce.org 了解为什么这是个好主意。
-
@sehe “也许”?我认为您误读了该链接上的讨论。 "foo(int *const a)" 接受一个指向 int 的 const 指针。在此处的示例中,“f(const int * a)”接受指向 const-int 的指针。
标签: c++