什么时候调用move构造函数?

时间:2018-11-01 18:34:19

标签: c++ class move move-semantics rvalue-reference

我试图理解移动语义,并根据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()测试移动分配运算符时,输出是预期的。我到底在这里想念什么?

0 个答案:

没有答案