转换和模板类型参数

Conversions and Template Type Parameters

本文关键字:类型参数 转换      更新时间:2023-10-16

我正在我的书中阅读有关转换和模板类型参数的内容,以下内容基本上让我感到困惑(我在引用的段落中写了我的问题):

"template <typename T> T fobj(T, T);
template <typename T> T fref(const T&, const T&);
int a[10], b[42];
fobj(a,b); //calls f(int*, int*)
fref(a,b); //error: array types don't match

"在[这对]调用中,我们传递数组参数,其中数组大小不同,因此具有不同的类型。[我的问题:从什么时候开始,不同大小的数组被认为是不同类型的?这两个数组不是都类型为"int"数组吗?这是什么意思?在对 fobj 的调用中,数组类型不同的事实并不重要。两个数组都转换为指针。fobj 中的模板参数类型为 int*。然而,对fref的呼吁是非法的。当参数是引用时,数组不会转换为指针。a 和 b 的类型不匹配,因此调用出错。[问题2:再次,a和b的类型如何不匹配,为什么这种调用是非法的?我不明白]"

Q1 从什么时候开始,不同大小的数组被视为不同类型的数组?

从始至终。这意味着这两个数组具有不同的类型:

int a[10];
int b[42];

Q2 a和b的类型如何不匹配,为什么这个调用是非法的?我不明白

它们具有不同的类型,明确a具有类型int[10]b具有类型int[42]。在某些上下文中,类型可以衰减到int*,例如当传递到期望int*的函数时。这是您引用的代码中的第一个函数模板中发生的情况。模板被实例化为类似的东西

int* fobj(int*, int*);

目前为止,一切都好。但是,通过引用ab的函数需要一个参数列表,例如

int foo( int const (&array1)[10], int const (&array2)[42] );

int const (&arr)[N]只是"const对大小N数组的int的引用"的语法。一个函数模板,可以接受两个具有相同类型但任意大小的元素的数组,然后

template <typename T, size_t N, size_t M> 
T fref(T const (&)[N], T const (&)[M]);

当你用 ab 实例化这个函数时,你会得到一个foo()上面的函数。