C++重载决议:数组引用与指针参数为何匹配优先级相同
核心疑问
在重载决议/函数声明场景下,为什么即使传入实参的真实类型是数组类型而非指针类型,指针类型并非匹配度更高,而是与数组类型被视为同等精确的匹配?
笔者此前查阅过多个关于重载决议与*数组到指针退化(array-to-pointer decay)*的相关问题,了解到传入int bar[3];时,编译器会将void foo(int (&a)[3]);与void foo(int* a);视为同等可行的重载,但始终不理解其设计逻辑(仅知道C++标准是如此规定的)。
以下示例代码会因函数调用歧义无法编译:
#include <iostream> #include <utility> void foo(int (&a)[2]) { std::cout << "Called concrete foo with N = 2"; } void foo(int* a) { std::cout << "Called pointer foo" << std::endl; } int main() { int a1[] = { 0x00 }; int a2[] = { 0x00, 0x01 }; int a3[] = { 0x00, 0x01, 0x02 }; foo(a1); foo(a2); foo(a3); }
按照技术逻辑直觉判断,调用foo(a2)时,int (&a)[2]应当比int* a的匹配度更精确——因为a2的真实类型是int[2](数组类型),而非int*(指针类型),那为什么编译器不会优先选择void foo(int (&a)[2])这个重载?
在此先行致谢。
延伸疑问
上述核心问题已有被采纳的解答,笔者还希望进一步了解该规则的设计考量:除了向后兼容的原因外,为什么标准会做如此规定?是否存在支持优先匹配数组引用重载而非指针重载的反例场景?
内容的提问来源于stack exchange,提问作者Chilippso
相关产品推荐
相关产品推荐

