0

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

"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 中的模板参数类型是 int*。调用但是fref是非法的,当参数是引用时,数组没有转化为指针,a和b的类型不匹配,所以调用出错。【问题2:再次,类型怎么做a 和 b 不匹配,为什么这个调用是非法的?我不明白] "

4

1 回答 1

2

Q1 什么时候不同大小的数组被认为是不同的类型?

一直以来。这意味着这两个数组具有不同的类型:

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

Q2 a 和 b 的类型怎么不匹配,为什么这个调用是非法的?我不理解

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

int* fobj(int*, int*);

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

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

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

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

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

于 2013-11-09T08:16:36.157 回答