由于重载解析不明确,此代码示例无法编译
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]重载解析规则可以节省时间并指导编译器选择第二种重载?为什么它更喜欢数组到指针的转换而不是直接引用绑定?
另外,我发现很多问题都是针对非常相似的问题,但它们似乎在一些重要的细微差别上有所不同。
在函数模板的部分排序期间,第二个重载比第一个重载更专业。
根据[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 = π 这样定义之后,表达式*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。 下面画图理解。从前