【发布时间】:2011-03-02 21:07:49
【问题描述】:
谁能帮我理解下面的代码
#include <iostream>
void foo(const char * c)
{
std::cout << "const char *" << std::endl;
}
template <size_t N>
void foo(const char (&t) [N])
{
std::cout << "array ref" << std::endl;
std::cout << sizeof(t) << std::endl;
}
int main()
{
const char t[34] = {'1'};
foo(t);
char d[34] = {'1'};
foo(d);
}
输出是
const char *
array ref
34
为什么第一个 foo 调用 const char * 版本?我怎样才能让它调用参考版本?
【问题讨论】:
-
@user511274 - 有趣的问题:)
-
啊,没有什么能比得上模棱两可的重载解析(又名 Koenig 查找)。一般来说,当给定一个以上的函数选择时,模板函数是最后选择的。
-
恭喜,你已经走到了 C++ 的尽头!
-
@Loadmaster:次要的挑剔,但 Koenig 查找是确定要考虑哪些功能的过程。然后重载决议是确定使用哪一个的以下过程。如果代码显示
::foo(t),则不会涉及 Koenig 查找,但会涉及重载解析。 -
@junjanes No. @Marlon 的编译器错误。
标签: c++