为什么采用指针的函数优于采用数组引用的函数?

Why is a function taking a pointer preferred over a function taking an array reference?

考虑以下程序:

#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', '[=10=]'};
        print(ca);
}

Results:

Print - using reference

为什么引用优先于指针?
根据 C++ Primer 第 5 版,第 6.6.1 节:

In order to determine the best match, the compiler ranks the conversions that could be used to convert each argument to the type of its corresponding parameter. Conversions are ranked as follows:

  1. An exact match. An exact match happens when:
    • The argument and parameter types are identical.
    • The argument is converted from an array or function type to the corresponding pointer type. (§ 6.7 (p. 247) covers function pointers.)
    • A top-level const is added to or discarded from the argument.
  2. Match through a const conversion (§ 4.11.2, p. 162).
  3. Match through a promotion (§ 4.11.1, p. 160).
  4. Match through an arithmetic (§ 4.11.1, p. 159) or pointer conversion (§ 4.11.2, p. 161).
  5. Match through a class-type conversion. (§ 14.9 (p. 579) covers these conversions.)

此处未提及参考资料。有什么想法吗?
谢谢

将引用直接绑定到参数表达式被视为身份转换。

对于参数为指针类型的函数,需要将数组类型隐式转换为指针类型

所以参数引用类型的函数更可行

来自 C++ 17 标准(16.3.3.1.4 参考绑定)

1 When a parameter of reference type binds directly (11.6.3) to an argument expression, the implicit conversion sequence is the identity conversion, unless the argument expression has a type that is a derived class of the parameter type, in which case the implicit conversion sequence is a derived-to-base Conversion (16.3.3.1).