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



考虑以下程序:

#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节:

为了确定最佳匹配,编译器对可用于将每个实参转换为其相应形参类型的转换。转换顺序如下:

  1. 精确匹配。精确匹配发生在:
    •实参和形参类型相同。
    •实参从数组或函数类型转换为相应的指针类型。(§6.7 (p. 247)涵盖函数指针)
    •在实参中添加或丢弃顶级const。
  2. 通过const转换匹配(第4.11.2节)。
  3. 通过提升匹配(第4.11.1节,p. 160)。
  4. 通过算术(第4.11.1节)或指针转换(第4.11.2节)匹配。
  5. 通过类类型转换匹配。(第14.9节(第579页)涵盖了这些转换。)

此处未提及参考文献。任何想法?


谢谢

将引用直接绑定到实参表达式被视为标识转换。

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

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

来自c++ 17标准(16.3.3.1.4 Reference binding)

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

相关内容

  • 没有找到相关文章

最新更新