我在c ++中的库中找到了一个函数,我无法分辨传入的参数的类型,所以我的知识和理解是完整的,这对我来说很有用。
对我来说,它们看起来像函数指针的数组,但没有*,我的假设是正确的吗?
template < typename _Tp , size_t _Nm >
inline void swap ( _Tp ( & __a ) [ _Nm ] , _Tp ( & __b ) [ _Nm ] )
答案 0 :(得分:3)
两个参数的类型相同。它们是对长度为_Nm
的数组的引用,其中每个元素的类型为_Tp
。元素的类型和数组的长度必须在两个参数中都匹配。在下面的例子中考虑这些参数类型和arrRef类型之间的相似性:
int arr1[] = {1, 2, 3, 4, 5};
int (&arrRef)[5] = arr1; // arrRef is a reference to arr1
例如,如果我们有以下内容:
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = {6, 7, 8, 9, 10};
swap(arr1, arr2);
我们使用签名swap
实例化void swap(int (&)[5], int (&)[5])
版本。
答案 1 :(得分:2)
它们引用了对象类型_Tp
和大小_Nm
的数组。
读取C或C ++类型的正确方法是声明反映使用。 _Tp ( & __a ) [ _Nm ]
表示如果给定该类型的变量__a
,您可以使用(__a)[n]
编写0 <= n < _Nm
,并获得_Tp
类型的对象。 &
类型修饰符的存在与*
修饰符类似;声明为_Tp ( * __a ) [ _Nm ]
的变量将是指向数组的指针,因为您可以编写(*__a)[n]
。