template <class T>
void swap(T& a, T& b){
T tmp = a; a = b; b = tmp;
}
我正在读一本书,它告诉我上面的代码不适用于数组,除非我们重载&#39; =&#39;运营商。我不明白它为什么不应该工作。我们是不是将指针切换到数组的第一个索引?
答案 0 :(得分:6)
首先,如果您将数组作为参数传递,则类型T
将被推断为数组类型,这会导致问题,因为您无法分配数组,只能复制它们。
然后你误以为你可以只是切换指针,这是不可能完成的。 如果 你有两个指针,交换它们会很好但你不能像这样切换数组。并且在调用中直接使用address-of运算符也不可能使用指向数组的指针,因为它会尝试将引用绑定到不可能的临时值。
仅解决方案#34;交换数组&#34;使用你的功能就像是
char array1[...] = { ... };
char array2[...] = { ... };
char* pointer_to_array1 = array1;
char* pointer_to_array2 = array2;
swap(pointer_to_array1, pointer_to_array2);
// After call, pointer_to_array1 will point to the first element of array2
// and pointer_to_array2 will point to the first element of array1
答案 1 :(得分:2)
我们不是要切换指向数组第一个索引的指针吗?
没有这样的事情。听起来你的C风格数组的心智模型是一个指向某些元素的指针。但这是错误的。实际上C风格的数组只是元素,没有指针。
当我们需要时,我们可以形成一个指向第一个元素的临时指针,但是没有这样的指针与数组存储一起存储。
与任何其他对象一样,数组在其整个生命周期中都位于同一地址。交换两个数组只能通过交换每个元素的内容来完成。