【发布时间】:2015-10-06 07:25:23
【问题描述】:
我可以使用如下模板函数捕获数组及其(编译时)大小:
template<int N>
void foo(const int (&)[N]) {
std::cout << "foo(const int (&)[N])\n";
}
但是,我想重载 foo 以允许指针指向 const,以便在对数组类型调用函数时使用第一个重载,在指针上调用第二个重载直接。
void foo(const int *) {
std::cout << "foo(const int *)\n";
}
int main() {
int a[1] = { 0 };
foo(a);
const int b[1] = { 0 };
foo(b);
}
这里,a 调用了第一个重载,b 调用了第二个。
我的猜测是,对于a,编译器必须执行转换为常量,这意味着foo(const int *) 不是完美匹配,但我不知道为什么这甚至不是一个模棱两可的函数调用。
如何更改代码以便在两种情况下都调用第一个重载?
【问题讨论】:
-
std::array不会发生这种情况:p
标签: c++ arrays templates pointers overloading