为啥采用指针的函数优于采用数组引用的函数?
Posted
技术标签:
【中文标题】为啥采用指针的函数优于采用数组引用的函数?【英文标题】:Why is a function taking a pointer preferred over a function taking an array reference?为什么采用指针的函数优于采用数组引用的函数? 【发布时间】:2021-11-19 03:18:30 【问题描述】:考虑以下程序:
#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', '\0';
print(ca);
Results:
Print - using reference
为什么引用优先于指针? 根据 C++ Primer 5th Ed.,第 6.6.1 节:
为了确定最佳匹配,编译器对 可用于将每个参数转换为其对应参数的类型的转换。转化排名如下:
完全匹配。在以下情况下发生完全匹配: • 自变量和参数类型相同。 • 参数从数组或函数类型转换为相应的指针类型。 (第 6.7 节(第 247 页)涵盖了函数指针。) • 在参数中添加或丢弃***常量。 通过 const 转换进行匹配(第 4.11.2 节,第 162 页)。 通过促销进行匹配(第 4.11.1 节,第 160 页)。 通过算术匹配(第 4.11.1 节,第 159 页)或指针转换(第 4.11.2 节,第 161 页)。 通过类类型转换进行匹配。 (§ 14.9 (p. 579) 涵盖了这些转换。)
这里没有提及参考。有什么想法吗? 谢谢
【问题讨论】:
没有与参考的no转换。类型是相同的,您只是通过引用传递它。 ('&' 不是类型的一部分,那里。)因此:完全匹配。 【参考方案1】:将引用直接绑定到参数表达式被视为身份转换。
对于带有指针类型参数的函数,需要从数组类型到指针类型的隐式转换。
所以参数被引用类型的函数更可行。
来自 C++ 17 标准(16.3.3.1.4 引用绑定)
1 当引用类型的参数直接绑定 (11.6.3) 到 参数表达式,隐式转换序列是恒等式 转换,除非参数表达式的类型是 参数类型的派生类,在这种情况下隐式 转换序列是派生到基础的转换 (16.3.3.1)。
【讨论】:
引用是别名 .. 所以你说这里不需要转换,对吧? @yapkm01这不是一个确切的别名,因为函数参数是对不完整数组类型的引用。 所以选择它是由于身份转换而转换为指针不是身份转换..我认为这里的问题是这个身份转换是什么?因为正如你所说,它是对不完整数组类型的引用(没有它的大小),而不是通常引用的确切别名 @yapkm01 将引用直接绑定到参数表达式称为身份转换。以上是关于为啥采用指针的函数优于采用数组引用的函数?的主要内容,如果未能解决你的问题,请参考以下文章