当前位置: 首页 > 知识库问答 >
问题:

数组引用绑定与带模板的数组到指针转换

荆鸿畅
2023-03-14

由于重载解析不明确,此代码示例无法编译

void g(char (&t)[4]) {}
void g(char *t) {}

int main()
{
  char a[] = "123";
  g(a);
}

仔细阅读过载解决规则可以清楚地看出它失败的原因。这里没有问题。

如果我们将其正式转换为模板版本

template <typename T> void g(T (&t)[4]) {}
template <typename T> void g(T *t) {}

int main()
{
  char a[] = "123";
  g(a);
}

它将继续“按预期”行事,并以同样性质的模糊性失败。到现在为止,一直都还不错。

然而,下面的版本编译没有任何问题,并选择第二个重载

template <typename T> void g(T &t) {}
template <typename T> void g(T *t) {}

int main()
{
  char a[] = "123";
  g(a);
}

如果我们注释掉第二个重载,第一个重载将被成功地用于T推断为char[4],即模板参数推断在第一个版本中按预期工作,有效地使其等效于void g(char(

然而,它是可以编译的。在第三种情况下,什么样的[template]重载解析规则可以节省时间并指导编译器选择第二种重载?为什么它更喜欢数组到指针的转换而不是直接引用绑定?

另外,我发现很多问题都是针对非常相似的问题,但它们似乎在一些重要的细微差别上有所不同。


共有1个答案

后阳炎
2023-03-14

在函数模板的部分排序期间,第二个重载比第一个重载更专业。

根据[temp.deduct.partial]/5在T上的引用

那么第一个重载的T总是可以根据第二个重载的参数推导出类型A*,但是第二个重载的T*不能根据第一个重载的参数推导出类型A

因此,第二个重载更加专业化,并被选中。

用<代码>T(

因此,在这种情况下,两个模板都不会更专业,偏序分断器不适用。

数组到指针的转换是不相关的。它不被认为比标识转换序列差(见[over.ics.rank]/3.2.1,不包括数组到指针转换的左值转换)。

 类似资料:
  • 指针运算 ///01.指针运算.c #include <stdio.h> #include <stdlib.h> //01.指针变量的运算符特点: // 1.指针变量的运算只有在所属数组的情况下才具备实际意义 // 2.指针变量的运算与其所指向的数据实体的类型密切相关 // 3.没有明确类型的指针变量完全无法进行访问(读取|修改) // 只是具备这存储地址这么一个唯一的功能 //

  • 数组的基本概念 整个数组的地址和数组首元素的地址 void main() { int a[] = {1, 2}; int b[100] = {1, 3}; int c[200] = {0}; //编译的时候就已经确定所有的值为零 memset(c, 0, sizeof(c)); //显式的重置内存块 //对一维数组 C 规定: //c 是数组首元素

  • 主要内容:关于数组指针的谜题数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以 为例,该数组在内存中的分布如下图所示: 定义数组时,要给出数组名和数组长度,数组名可以认为是一个 指针,它指向数组的第 0 个元素。 在C语言中,我们将第 0 个元素的地址称为数组的首地址。以上面的数组为例,下图是 arr 的指向:

  • 本文向大家介绍指针数组、数组指针、函数指针的区别?相关面试题,主要包含被问及指针数组、数组指针、函数指针的区别?时的应答技巧和注意事项,需要的朋友参考一下 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。 数组指针:首先它是一个指针,它指向一个数组。在32

  • 6. 指向指针的指针与指针数组 指针可以指向基本类型,也可以指向复合类型,因此也可以指向另外一个指针变量,称为指向指针的指针。 int i; int *pi = &i; int **ppi = &pi; 这样定义之后,表达式*ppi取pi的值,表达式**ppi取i的值。请读者自己画图理解i、pi、ppi这三个变量之间的关系。 很自然地,也可以定义指向“指向指针的指针”的指针,但是很少用到: int

  • 3. 指针与数组 先看个例子,有如下语句: int a[10]; int *pa = &a[0]; pa++; 首先指针pa指向a[0]的地址,注意后缀运算符的优先级高于单目运算符,所以是取a[0]的地址,而不是取a的地址。然后pa++让pa指向下一个元素(也就是a[1]),由于pa是int *指针,一个int型元素占4个字节,所以pa++使pa所指向的地址加4,注意不是加1。 下面画图理解。从前