C++重载时接受数组引用的函数为何优先级高于接受指针的函数
问题解答
你给出的代码运行后调用数组引用版本的重载,核心原因是《C++ Primer》中提到的重载匹配等级仅划分了大的优先级层级,同一层级内部还有更细的比较规则,这个细节是你提到的规则里没有覆盖的。
首先给出完整测试代码:
#include <iostream> #include <cstring> using namespace std; void print(const char *pa) { cout << "Print - using pointer" << endl; } void print(const char (&arr)[]) { cout << "Print - using reference" << endl; } int main() { char ca[] = {'B', 'A', 'D', 'C', '\0'}; print(ca); }
运行结果:
Print - using reference
原理拆解
- 首先明确实参类型:
ca的类型是char[5],是长度为5的字符数组类型,本身不是指针,数组转指针是需要触发转换的。 - 两个重载的转换成本对比:
- 匹配
const char*版本:需要做两次转换,首先将char[5]做数组到指针的退化得到char*,再进行底层const转换得到const char*,虽然属于精确匹配等级,但涉及数组到指针的转换操作。 - 匹配
const char (&arr)[]版本:这里的形参是未知边界的const char数组引用,支持绑定任意长度的同元素类型数组,仅需要给char[5]增加底层const修饰就可以直接绑定引用,不需要做数组到指针的退化,属于无额外转换的精确匹配。
- 匹配
- 按照C++标准的重载决议规则:同一转换等级下,不需要数组到指针转换的匹配序列,优先级高于需要该转换的序列,因此编译器会优先选择数组引用的重载版本。
内容的提问来源于stack exchange,提问作者yapkm01
相关产品推荐
相关产品推荐

