我试图理解移动语义,并根据C ++ 5规则编写了一些简单的代码来举例说明不同类型的方法,但是我遇到了有关移动构造函数的实际问题自定义类myClass
的类型:
#include <vector>
#include <iostream>
class myClass{
std::vector<float> data;
public:
//ctors
myClass() : data (std::vector<float> (1,0.0)) {
printf("empty ctor\n");
};
myClass(const myClass& _other) {
printf("copy ctor\n");
data=_other.data;
};
myClass(myClass&& _other) {
printf("move ctor\n");
if (this != &_other) {
data=_other.data;
_other.data.clear();
}
};
//dtor
~myClass() { data.clear(); };
//op overloads
myClass& operator=(const myClass& _other) {
printf("copy assignment\n");
data=_other.data;
return *this;
};
myClass& operator=(myClass&& _other) {
printf("move assignment\n");
if (this != &_other) {
data=_other.data;
_other.data.clear();
}
return *this;
};
//gp members
void push_val(float _val) { data.push_back(_val); };
float get_val(int _ind) { return data[_ind]; };
};
myClass myFunc() {
myClass FF;
return FF;
};
int main(int argc, char const *argv[]){
// empty ctor:
myClass A;
// copy ctor:
A.push_val(1.0);
myClass B = A;
// move ctor:
myClass C = myFunc();
myClass D = std::move(myFunc());
// copy assignment:
A = C;
// move assignment:
B = myFunc();
return 0;
}
提供输出:
empty ctor
copy ctor
empty ctor
empty ctor
move ctor
copy assignment
empty ctor
move assignment
除了一个特殊情况外,大多数情况下是期望的:实例化C
时,它分配myFunc()
(我假设是一个右值)的输出,这是空的构造函数myClass
的of而不是move构造函数被调用。奇怪的是,当使用B = myFunc()
测试移动分配运算符时,输出是预期的。我到底在这里想念什么?