我有以下代码:
#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
时则不成功。为什么会发生这种情况,我能以某种方式修复它吗?
答案 0 :(得分:7)
您的移动构造函数需要const SomeType&&
而不是SomeType&&
。你不能调用一个带SomeType&&
(你的移动构造函数)的函数,其值为const SomeType&&
。
尝试制作一个带SomeType&&
的移动构造函数。
答案 1 :(得分:5)
std::move
转换为r值引用。因此它将other
转换为const SomeType &&
。这当然不能绑定到SomeType &&
,因此它会回退到const SomeType &
。
从移动构造函数的参数中删除const
。