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

yap*_*m01 1 c++ arrays function overload-resolution c++11

考虑以下程序:

\n
#include <iostream>\n#include <cstring>\nusing namespace std;\n\nvoid print(const char *pa) { \n        cout << "Print - using pointer" << endl;\n}\n\nvoid print(const char (&arr)[]) {\n        cout << "Print - using reference" << endl;\n}\n\nint main() { \n        char ca[] = {'B', 'A', 'D', 'C', '\\0'};\n        print(ca);\n}\n\nResults:\n\nPrint - using reference\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

为了确定最佳匹配,编译器会对\n可用于将每个参数转换为其相应参数类型的转换进行排名。转化排名如下:

\n
    \n
  1. 完全匹配。当出现以下情况时,会发生完全匹配:
    \n\xe2\x80\xa2 参数和形参类型相同。
    \n\xe2\x80\xa2 参数从数组或函数类型转换为相应的指针类型。(\xc2\xa7 6.7 (p. 247) 涵盖了函数指针。)
    \n\xe2\x80\xa2 顶级常量被添加到参数中或从参数中删除。
  2. \n
  3. 通过 const 转换进行匹配(\xc2\xa7 4.11.2,第 162 页)。
  4. \n
  5. 通过促销进行匹配(\xc2\xa7 4.11.1,第 160 页)。
  6. \n
  7. 通过算术(\xc2\xa7 4.11.1,第 159 页)或指针转换(\xc2\xa7 4.11.2,第 161 页)进行匹配。
  8. \n
  9. 通过类-类型转换进行匹配。(\xc2\xa7 14.9 (p. 579) 涵盖了这些转换。)
  10. \n
\n
\n

这里没有提到参考。任何想法?
\n谢谢

\n

Vla*_*cow 5

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

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

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

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

1 当引用类型的参数直接绑定(11.6.3)到参数表达式时,隐式转换序列是恒等转换,除非参数表达式的类型是参数类型的派生类,在这种情况下,隐式转换序列是恒等转换。转换序列是派生到基数的转换 (16.3.3.1)。