转换和模板类型参数
Conversions and Template Type Parameters
我正在我的书中阅读有关转换和模板类型参数的内容,以下内容基本上让我感到困惑(我在引用的段落中写了我的问题):
"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*);
目前为止,一切都好。但是,通过引用a
和b
的函数需要一个参数列表,例如
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]);
当你用 a
和 b
实例化这个函数时,你会得到一个foo()
上面的函数。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将空*参数转换为各种类型的参数是UB吗?
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- C++可变参数模板类型筛选转换
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- 将参数转换为目标类型时,复制用于直接初始化的构造函数省略
- 如果 JVM 的参数是从其他类型的转换而来的,JNI 找不到该类
- 模板参数类型通过转换操作员扣除
- 为什么指针类型强制转换不适用于模板非类型参数
- 转换和模板类型参数
- 移动语义:从"类型&&"到"类型"的转换无效。模板:将未知参数传递给重载函数
- 没有已知的参数从类型到类型的转换
- 在没有constexpr的模板非类型参数处进行类型转换
- 为什么模板类型参数不能隐式强制转换?
- 显式转换模板非类型参数时出错
- 如何将来自用户定义文字的可变char模板参数转换回数字类型
- 无法将不完整类型'void *'的参数转换为'const bitData'
- Qt,无法将不完整类型'A *'的参数转换为'const QObject *'
- 根据不同的模板参数转换为不同的数据类型
- 将可变迭代器参数转换为值类型的元组