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\nRun Code Online (Sandbox Code Playgroud)\n为什么引用优于指针?
\n根据 C++ Primer 第 5 版,第 6.6.1 节:
\n\n为了确定最佳匹配,编译器会对\n可用于将每个参数转换为其相应参数类型的转换进行排名。转化排名如下:
\n\n
\n- 完全匹配。当出现以下情况时,会发生完全匹配:
\n
\n\xe2\x80\xa2 参数和形参类型相同。
\n\xe2\x80\xa2 参数从数组或函数类型转换为相应的指针类型。(\xc2\xa7 6.7 (p. 247) 涵盖了函数指针。)
\n\xe2\x80\xa2 顶级常量被添加到参数中或从参数中删除。- 通过 const 转换进行匹配(\xc2\xa7 4.11.2,第 162 页)。
\n- 通过促销进行匹配(\xc2\xa7 4.11.1,第 160 页)。
\n- 通过算术(\xc2\xa7 4.11.1,第 159 页)或指针转换(\xc2\xa7 4.11.2,第 161 页)进行匹配。
\n- 通过类-类型转换进行匹配。(\xc2\xa7 14.9 (p. 579) 涵盖了这些转换。)
\n
这里没有提到参考。任何想法?
\n谢谢
将引用直接绑定到参数表达式被视为身份转换。
对于参数为指针类型的函数,需要从数组类型到指针类型的隐式转换。
所以参数引用类型的函数更可行。
来自 C++ 17 标准(16.3.3.1.4 参考绑定)
1 当引用类型的参数直接绑定(11.6.3)到参数表达式时,隐式转换序列是恒等转换,除非参数表达式的类型是参数类型的派生类,在这种情况下,隐式转换序列是恒等转换。转换序列是派生到基数的转换 (16.3.3.1)。