【问题标题】: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 节:

为了确定最佳匹配,编译器对 可用于将每个参数转换为其对应参数的类型的转换。转化排名如下:

  1. 完全匹配。在以下情况下发生完全匹配:
    • 自变量和参数类型相同。
    • 参数从数组或函数类型转换为相应的指针类型。 (第 6.7 节(第 247 页)涵盖了函数指针。)
    • 在参数中添加或丢弃顶级常量。
  2. 通过 const 转换进行匹配(第 4.11.2 节,第 162 页)。
  3. 通过促销进行匹配(第 4.11.1 节,第 160 页)。
  4. 通过算术匹配(第 4.11.1 节,第 159 页)或指针转换(第 4.11.2 节,第 161 页)。
  5. 通过类类型转换进行匹配。 (§ 14.9 (p. 579) 涵盖了这些转换。)

这里没有提及参考。有什么想法吗?
谢谢

【问题讨论】:

  • 没有与参考的no转换。类型是相同的,您只是通过引用传递它。 ('&' 不是类型的一部分,那里。)因此:完全匹配

标签: c++ arrays function c++11 overload-resolution


【解决方案1】:

将引用直接绑定到参数表达式被视为身份转换。

对于带有指针类型参数的函数,需要从数组类型到指针类型的隐式转换。

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

来自 C++ 17 标准(16.3.3.1.4 引用绑定)

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

【讨论】:

  • 引用是别名 .. 所以你说这里不需要转换,对吧?
  • @yapkm01这不是一个确切的别名,因为函数参数是对不完整数组类型的引用。
  • 所以选择它是由于身份转换而转换为指针不是身份转换..我认为这里的问题是这个身份转换是什么?因为正如你所说,它是对不完整数组类型的引用(没有它的大小),而不是通常引用的确切别名
  • @yapkm01 将引用直接绑定到参数表达式称为身份转换。
猜你喜欢
  • 2018-01-28
  • 2013-08-08
  • 2017-09-17
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 2022-01-18
相关资源
最近更新 更多