【问题标题】:why std::swap does not work with address operator?为什么 std::swap 不适用于地址运算符?
【发布时间】:2014-03-23 17:34:36
【问题描述】:

为什么在 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*)!

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

【问题讨论】:

  • 临时对象不能绑定到非常量左值引用。
  • 您期望发生什么?
  • 交换两个临时值有什么用?
  • 没有swap(int*, int*),有swap(int*&, int*&)
  • swap(4,5)一样——那会是什么?

标签: c++ std


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多