【发布时间】:2016-04-01 08:55:48
【问题描述】:
template <class T>
void swap(T& a, T& b){
T tmp = a; a = b; b = tmp;
}
我正在读一本书,它告诉我上面的代码将不适用于数组,除非我们重载了 '=' 运算符。我不明白为什么它不应该工作。我们不是在切换指向数组第一个索引的指针吗?
【问题讨论】:
标签: c++ arrays parameter-passing swap
template <class T>
void swap(T& a, T& b){
T tmp = a; a = b; b = tmp;
}
我正在读一本书,它告诉我上面的代码将不适用于数组,除非我们重载了 '=' 运算符。我不明白为什么它不应该工作。我们不是在切换指向数组第一个索引的指针吗?
【问题讨论】:
标签: c++ arrays parameter-passing swap
首先,如果您将数组作为参数传递,则类型T 将被推断为数组类型,这会导致问题,因为您不能分配数组,只复制它们。
那么您的误解是您可以只切换指针,这是无法做到的。 如果你有两个指针,交换它们可以正常工作,但你不能像那样切换数组。而且也不可能直接在调用中使用地址运算符来使用指向数组的指针,因为这将尝试将引用绑定到不可能的临时值。
only 使用您的函数“交换数组”的解决方案类似于
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
【讨论】:
std::swap 可以做到这一点。
我们不是在切换指向数组第一个索引的指针吗?
没有这样的事情。听起来您对 C 样式数组的心智模型是指向某些元素的指针。然而这是错误的。其实C风格的数组只是元素,没有指针。
我们可以在需要时形成一个指向第一个元素的临时指针,但没有这样的指针与数组存储一起存储。
与任何其他对象一样,数组在其整个生命周期中都位于同一地址。交换两个数组只能通过交换每个元素的内容来完成。
【讨论】: