C++ 用于常量数组和指向常量的指针的重载函数

C++ 用于常量数组和指向常量的指针的重载函数,c++,arrays,templates,pointers,overloading,C++,Arrays,Templates,Pointers,Overloading,我可以使用如下模板函数捕获数组及其(编译时)大小: 模板 void foo(const int(&)[N]){ 无法解释为什么它不起作用 在您的示例中,编译器匹配会考虑这两个重载。下面是重载解决方案,以消除其中一个并保持最佳匹配。根据标准草案13.3.3/1.6最佳可行函数[over.match.best]: F1不是函数模板专用化,F2是函数 模板专门化 在我们的例子中,F1是void foo(const int*)和F2是模板 void foo(const int(&)[N])。因此,F1将

我可以使用如下模板函数捕获数组及其(编译时)大小:

模板
void foo(const int(&)[N]){
无法解释为什么它不起作用
在您的示例中,编译器匹配会考虑这两个重载。下面是重载解决方案,以消除其中一个并保持最佳匹配。根据标准草案13.3.3/1.6最佳可行函数[over.match.best]:

F1不是函数模板专用化,F2是函数 模板专门化

在我们的例子中,F1是
void foo(const int*)
F2
模板
void foo(const int(&)[N])
。因此,F1将优先于F2,因为F1不是模板专门化,而F2是

解决方案 在第二个重载中通过引用传递指针:

void foo(const int *&) {
    std::cout << "foo(const int *)\n";
}
void foo(const int*&){

std::难道这不会发生在
std::array
上吗:你能解释一下为什么这是可行的,但原来的方法不行吗?这个重载在非常量指针上不起作用。@rozina我知道,对于非
const
指针,可能会有另一个重载
void foo(int*&)
似乎不是有用的重载。也不适用于Alexander的示例。@当传递
常量int[N]时,OP中的两个函数都被认为是重载解析的精确匹配项
。第二个重载不是模板,因此它是首选的。在这个答案中,
const int*&
不能绑定到
int*
int[N]
参数,因为可能会将
const int*
分配给它,并违反const正确性(想象调用方随后会对指向的对象进行变异)。