标准交换如何推断数组的长度

How does std swap deduce the length of an array?

本文关键字:数组 何推断 交换 标准      更新时间:2023-10-16

这是使用 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