强制移动语义

Xan*_*anx 6 move-semantics c++11

我正在尝试使用移动语义(就像一个实验).这是我的代码:

class MyClass {
public:
    MyClass(size_t c): count(c) {
        data = new int[count];
    }



    MyClass( MyClass&& src) : count(src.count) {
        data = src.data;
        src.count = 0;
        src.data = nullptr;
    }

    void operator=( MyClass&& src) {
        data = src.data;
        count = src.count;
        src.count = 0;
        src.data = nullptr;
    }




    ~MyClass() {
        if (data != nullptr)
            delete[] data;
    }

    int* get_data() const {
        return data;
    }

    size_t get_count() const {
        return count;
    }

private:

    MyClass(const MyClass& src) : count(src.count) {
        data = new int[src.count];
        memcpy(data, src.data, sizeof(int)*src.count);
    }

    void operator=(const MyClass& src) {
        count = src.count;
        data = new int[src.count];
        memcpy(data, src.data, sizeof(int)*src.count);
    }


    int* data;
    size_t count;
};


int main()
{
    MyClass mc(150);
    for (size_t i = 0; i < mc.get_count(); ++i)
        mc.get_data()[i] = i;
    MyClass &&mc2 = std::move(mc);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是std :: move不会将mc移动到mc2,它只是复制(copyies指针就是这样).如果我删除复制构造函数编译器为MyClass生成它.

我如何强制使用移动语义?如何使它在这种结构中使用:

MyClass mc2(mc); //Move, not copy
-or-
MyClass mc2 = mc; //Move, not copy
Run Code Online (Sandbox Code Playgroud)

我试图使用'&&'运算符来明确标记rvalue,但是,原因是它不起作用.

Rei*_*ica 6

你声明m2作为参考,不能作为价值。因此,它仍然指的是初始化时的内容m1。您想要这样:

MyClass mc2 = std::move(mc);
Run Code Online (Sandbox Code Playgroud)

现场例子

至于第二部分,则无法强制执行以下结构:

MyClass mc2(mc); //Move, not copy
//-or-
MyClass mc2 = mc; //Move, not copy
Run Code Online (Sandbox Code Playgroud)

移动。如果要从左值(mc实际上是左值)移动,则必须std::move显式使用(或将另一类型转换为右值)。

可以做一件事,但这将是肮脏的hack,会使代码不直观,并成为bug的重要来源。您可以使用非const引用添加复制构造函数(和复制赋值运算符)的重载,从而完成此操作。基本上std::auto_ptr,以前应该做过类似的事情。但是,例如,它永远不会通过代码审查。如果您想移动,只需std::move


一些注意事项:

  • 确保在空指针上调用delete或是delete[]空操作,因此可以安全地if从析构函数中删除。

  • 通常最好在C ++代码中使用,std::copymemcpy不用担心得到sizeof正确的代码