C++ std swap如何推断数组的长度?

C++ std swap如何推断数组的长度?,c++,arrays,swap,C++,Arrays,Swap,下面是使用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} swap函数声明为 template <class T, size_t N> void swap(T (&a)[N], T (&b)[N]) noexcept (noexcept(

下面是使用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}
swap函数声明为

template <class T, size_t N> void swap(T (&a)[N], T (&b)[N])
  noexcept (noexcept(swap(*a,*b)));
模板无效交换(T&a[N],T&b[N])
无例外(无例外(掉期(*a,*b));
我很好奇
size\t N
演绎的机制,它是如何实现的?因为int数组的指针没有关于其长度的任何信息。

对数组的引用只允许绑定到正确范围的数组。例如,
int(&)[10]
不能绑定到大小不是10的
int
数组,也不能绑定到
int*
。当您有一个引用数组类型的参数时,也是如此


当将数组传递给函数且参数不是引用时,参数将衰减为指向数组第一个元素的指针。但是,当通过引用传递数组时,出于模板参数推断的目的,参数类型不会衰减。这是因为对数组参数的引用不能绑定到指针。由于参数类型未衰减,因此可以正确推断模板参数
N

数组不是指针。数组携带其大小信息,数组是传递给函数的。
int*
int[3]
int[4]
是不同的类型