在boost/utility/swap.hpp
我找到了这段代码:
template<class T, std::size_t N>
void swap_impl(T (& left)[N], T (& right)[N])
{
for (std::size_t i = 0; i < N; ++i)
{
::boost_swap_impl::swap_impl(left[i], right[i]);
}
}
什么是left
和right
?它们是否引用了数组?此代码是否允许C ++ ISO标准2003或更高版本?
答案 0 :(得分:7)
答案 1 :(得分:2)
什么是左右?它们是否引用了数组?此代码是否允许C ++ ISO标准2003或更高版本?
是。他们引用到数组。
这意味着,您可以将swap_impl
称为:
int a[10]; //array
int b[10];
//...
swap_impl(a,b); //correct
但无法将swap_impl
称为:
int *a = new int[10]; //pointer
int *b = new int[10];
//...
swap_impl(a,b); //compilation error
另请注意,您甚至无法做到这一点:
int a[10];
int b[11];
//...
swap_impl(a,b); //compilation error - a and b are arrays of different size!
重点:
- 不仅参数必须是数组,而且数组必须大小相同!
答案 2 :(得分:1)
这是声明对名为left和right的T(大小为N)数组的引用的方法。代码是合法的C ++。
这允许你传入:
int ones[5] = { 1,1,1,1,1 };
int twos[5] = { 2,2,2,2,2 };
swap_impl(ones, twos);
然后模板类型推断将知道您有T = int和N = 5并进行就地交换。如果您不匹配类型或大小,则会得到方便的编译失败。
答案 3 :(得分:1)
是的,这是很早就允许的标准C ++(基本上是C,加上参考)。
使用typedef可以更容易阅读:
int main()
{
typedef int (&MyArray)[4];
int data[4];
MyArray dataRef = data;
}
它反映了函数typedef
typedef int (*MyFunc)();