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

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 将引用直接绑定到参数表达式称为身份转换。

以上是关于为啥采用指针的函数优于采用数组引用的函数?的主要内容,如果未能解决你的问题,请参考以下文章

可以将 Java 数组传递给采用数组的 C/C++ 函数吗?

C++:调用无参数的构造函数为啥不加括号

为啥我不能访问指向数组中成员函数的指针?

从 C++ 中的函数返回指向数组的指针?

为啥指针分配的内存在函数之后仍然存在,而不是数组?

为啥在使用单指针传递给函数时必须对二维数组进行类型转换?