谢谢
考虑以下程序:
#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', ' '};
print(ca);
}
Results:
Print - using reference
为什么引用优于指针?
根据c++ Primer第5版,第6.6.1节:
为了确定最佳匹配,编译器对可用于将每个实参转换为其相应形参类型的转换。转换顺序如下:
- 精确匹配。精确匹配发生在:
•实参和形参类型相同。
•实参从数组或函数类型转换为相应的指针类型。(§6.7 (p. 247)涵盖函数指针)
•在实参中添加或丢弃顶级const。- 通过const转换匹配(第4.11.2节)。
- 通过提升匹配(第4.11.1节,p. 160)。
- 通过算术(第4.11.1节)或指针转换(第4.11.2节)匹配。
- 通过类类型转换匹配。(第14.9节(第579页)涵盖了这些转换。)
此处未提及参考文献。任何想法?
谢谢
将引用直接绑定到实参表达式被视为标识转换。
对于形参为指针类型的函数,需要从数组类型隐式地转换为指针类型。
所以函数的参数引用类型是更可行的
来自c++ 17标准(16.3.3.1.4 Reference binding)
1引用类型的形参(11.6.3)直接绑定到参数表达式,隐式转换序列是恒等式转换,除非实参表达式的类型为派生类的参数类型,在这种情况下隐式转换序列是派生到基的转换(16.3.3.1)。