You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:48:03