C++ 和数组中的通用交换函数

generic swap function in c++ and arrays

template <class T>
 void swap(T& a, T& b){
     T tmp = a; a = b; b = tmp;
}

我正在读一本书,它告诉我上面的代码不适用于数组,除非我们重载“=”运算符。我不明白为什么它不应该工作。我们不是将指针切换到数组的第一个索引吗?

首先,如果您将数组作为参数传递,类型 T 将被推断为数组类型,这会导致问题,因为您不能分配数组,只能复制它们。

那你就误以为只要切换指针就可以了,那是做不到的。 如果你有两个指针,交换它们会很好,但你不能像那样只切换数组。并且也不可能在调用中直接使用地址运算符来使用指向数组的指针,因为这将尝试将引用绑定到不可能的临时值。

"swap arrays" 使用您的函数的解决方案类似于

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

Are we not switching around the pointers to the first index of the arrays?

没有这样的事情。听起来您对 C 风格数组的心智模型是指向某些元素的指针。然而这是错误的。实际上C风格的数组只是元素,没有指针。

当我们需要时,我们可以形成一个指向第一个元素的临时指针,但是没有这样的指针与数组存储一起存储。

与任何其他对象一样,数组在其整个生命周期内都位于同一地址。交换两个数组只能通过交换每个元素的内容来完成。