我正在阅读关于转换和模板类型参数的书中,以下内容基本上让我感到困惑(我在引用的段落中写了我的问题):
"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
“在[this]调用中,我们传递数组参数,其中数组的大小不同,因此具有不同的类型。[我的问题:因为不同大小的数组何时被认为是不同的类型?不是这两个数组都是“int”数组吗?这是什么意思?]在对fobj的调用中,数组类型不同的事实并不重要。两个数组都转换为指针。模板参数fobj中的type是int *。但是,对fref的调用是非法的。当参数是引用时,数组不会转换为指针.a和b的类型不匹配,因此调用是错误的。 [问题2:再次,a和b的类型如何不匹配,为什么这个调用非法?我不理解] “
答案 0 :(得分:2)
Q1因为不同大小的数组何时被认为是不同的类型?
始终如此。这意味着这两个数组有不同的类型:
int a[10];
int b[42];
Q2 a和b的类型如何不匹配,为什么这个呼叫到底是非法的?我不理解
它们具有不同的类型,显式a
类型为int[10]
,b
类型为int[42]
。在某些上下文中,类型可以衰减到int*
,例如在传递到期望int*
的函数时。这是您引用的代码中的第一个函数模板中发生的情况。模板被实例化为类似
int* fobj(int*, int*);
到目前为止一切顺利。但是,通过引用获取a
和b
的函数需要一个参数列表,例如
int foo( int const (&array1)[10], int const (&array2)[42] );
int const (&arr)[N]
只是“const
引用N
s int
数组”的语法。可以接受两个具有相同类型但任意大小的元素的数组的函数模板将是
template <typename T, size_t N, size_t M>
T fref(T const (&)[N], T const (&)[M]);
当您使用a
和b
实例化此功能时,您将获得上述foo()
之类的功能。