C ++移动语义:为什么调用复制赋值operator =(&)而不是移动赋值operator =(&&)?

时间:2013-11-14 14:00:11

标签: c++ c++11 operator-overloading move move-constructor

我有以下代码:

#include <cstdio>
#include <iostream>

using std::cout;

struct SomeType {
  SomeType() {}

  SomeType(const SomeType &&other) {
    cout << "SomeType(SomeType&&)\n";
    *this = std::move(other);
  }

  void operator=(const SomeType &) {
    cout << "operator=(const SomeType&)\n";
  }

  void operator=(SomeType &&) {
    cout << "operator=(SomeType&&)\n";
  }
};

int main() {
  SomeType a;
  SomeType b(std::move(a));
  b = std::move(a);
  return 0;
}

我希望移动构造函数调用移动赋值运算符。以下是该计划的输出:

SomeType(SomeType&&)
operator=(const SomeType&)
operator=(SomeType&&)

如您所见,移动赋值运算符已成功调用,但在移动构造函数中分配给*this时则不成功。为什么会发生这种情况,我能以某种方式修复它吗?

2 个答案:

答案 0 :(得分:7)

您的移动构造函数需要const SomeType&&而不是SomeType&&。你不能调用一个带SomeType&&(你的移动构造函数)的函数,其值为const SomeType&&

尝试制作一个带SomeType&&的移动构造函数。

答案 1 :(得分:5)

std::move转换为r值引用。因此它将other转换为const SomeType &&。这当然不能绑定到SomeType &&,因此它会回退到const SomeType &

从移动构造函数的参数中删除const