为了防止任何混淆,我非常理解数组和指针之间的区别,衰减到指针的概念,以及在C++中通过引用传递数组的概念等.
这里我的问题具体是关于编译器从一组函数重载候选中选择函数的规则,当一个重载采用数组引用时,另一个重载采用指针.
例如,假设我们有:
template <class T, std::size_t N>
void foo(const T (&arr)[N])
{
std::cout << "Array-reference overload!" << std::endl;
}
template <class T>
void foo(const T* ptr)
{
std::cout << "Pointer overload!" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我们尝试foo()按如下方式调用函数模板:
const char arr[2] = "A";
foo(arr);
Run Code Online (Sandbox Code Playgroud)
...然后我的期望是编译器将选择第一个重载,即采用数组引用的重载.
但是,使用GCC 4.9.2,如果我编译上面的代码,我会收到一个错误:
test.cpp:28:9: error: call of overloaded ‘foo(const char [2])’ is ambiguous
Run Code Online (Sandbox Code Playgroud)
我不清楚为什么这两个重载被编译器认为是同样好的候选者,因为第一个重载完全匹配类型,而第二个重载需要额外的衰减到指针步骤.
现在,我可以通过显式使用type_traits如下来获得上述重载:
template <class T, std::size_t N>
void foo(const T (&arr)[N])
{
std::cout …Run Code Online (Sandbox Code Playgroud)