标准交换如何推断数组的长度
How does std swap deduce the length of an array?
这是使用 std::swap 交换两个数组的值的情况。
int arr1[3]={1,2,3};
int arr2[3]={4,5,6};
std::swap(arr1,arr2);
//Then arr1 becomes {4,5,6} and arr2 becomes {1,2,3}
交换函数声明为
template <class T, size_t N> void swap(T (&a)[N], T (&b)[N])
noexcept (noexcept(swap(*a,*b)));
我很好奇size_t N
演绎的机制,它是如何完成的?由于 int 数组的指针没有任何关于其长度的信息。
只允许对数组的引用绑定到正确范围的数组。例如,int (&)[10]
不能绑定到大小不是 10 的int
数组,也不能绑定到int*
数组。当您具有引用数组类型的参数时,也是如此。
当您将数组传递给函数并且该参数不是引用时,参数将衰减到指向数组第一个元素的指针。但是,当您通过引用传递数组时,出于模板参数推导的目的,参数类型不会衰减。这是因为对数组参数的引用无法绑定到指针。由于参数类型未衰减,因此可以正确推断模板参数N
。
相关文章:
- 通过C++模板元编程从数组名称推断数组维度
- 如何在模板中推断数组类型?
- 对未知大小数组的引用的列表初始化:它是否应该推断数组大小?
- 为什么动态分配的数组不能从列表初始值设定项推断其大小
- 字符数组的模板类型推断
- 标准交换如何推断数组的长度
- 为什么数组的类型推断会将指向第一个的指针优先于对数组的引用
- 动态对象数组在C++和Java中有何不同?
- 为什么 gcc 无法推断数组参数的模板化大小?(C++11)
- 创建动态数组后,"i"变量不知从何而来
- 无法从多维数组的初始值设定项推断出边界
- 如何从 std::array<T, N>::p ointer 成员/依赖类型推断数组大小?
- 这些数组类型有何不同
- 数组特征导致模板参数推断失败
- 动态创建数组 - 无法推断出"T"的模板参数 - C++
- 在类定义内初始化具有推断维度的静态const多维数组
- 从整型模板推断c++数组大小
- 在C++中,动态数组与静态绑定数组有何不同
- for范围循环如何推断普通数组的大小?
- 初始化数组与错置内存有何不同?