为什么std :: swap不能与地址运算符一起使用?

时间:2014-02-21 23:39:33

标签: c++ std

为什么在C ++中使用std :: swap()我不能交换地址?
例如,使用以下

int x = 1, y = 2; 
std::swap(&x, &y);

我收到了编译错误:

  

错误:没有匹配函数来调用'swap(int *,int *)'

但如果我这样做:

int *px = &x, *py = &y;
std::swap(px, py);

工作正常。所以有一个swap(int *,int *)!

知道第一个版本有什么问题吗? 提前谢谢。

1 个答案:

答案 0 :(得分:8)

std::swap通过(左值)引用获取其参数。因此,你传递的必须是左值。此外,参数引用的类型必须是MoveConstructible和MoveAssignable(因此,并非所有左值都必须工作 - 例如,尝试交换两个字符串文字可能会失败)。