c++ - 未调用 move 赋值运算符

标签 c++ c++11 move

我刚刚做了一些 move 语义练习,我似乎无法弄清楚为什么我的 move 赋值运算符没有被调用

我的课如下(请忽略与问题无关的任何不良做法):

private:
    int sz;
    double* elems;

public:
    Vector(int size):sz(size), elems(new double[size])
    {
         for(int i=0; i!=sz; ++i)
         {
             elems[i] = i;
         }
    }

    ~Vector()
    {
         std::cout << "Destruct " << std::endl; delete [] elems;
    }

    double& operator[](int i)
    {
        return elems[i];
    }
    const double& operator[](int i)const 
    {
         return elems[i];
    }

    //operator+ to add vectors
    friend Vector operator+(const Vector& a, const Vector& b)
    {

        Vector ret(a.sz);
        if(a.sz!=b.sz)
            return 0;
        std::cout << "Adding" << std::endl;
        for(int i=0; i!=a.sz; ++i)
        {
            ret[i] = a[i] + b[i];
        }

        return ret;
     }

     //move constructor
     Vector(Vector&& a): sz(a.sz),elems(a.elems)
     {
          std::cout << "Move constructor"<< std::endl;
          a.elems = nullptr;
          a.sz = 0;
     }

     //move assignment
     Vector& operator=(Vector&& a)
     {
        std::cout << "Moveeee" << std::endl;
        delete [] elems;
        elems = a.elems;
        sz = a.sz;
        a.elems = nullptr;
        a.sz = 0;

        return *this;
     }

现在我的测试用例如下:

Vector v1(3);
Vector v2(3);
Vector v3(3);
Vector v4 = v1+v2;

输出如下:

Adding
Move constructor
Destruct
Destruct
Destruct
Destruct
Destruct

我期望 Vector v4 = v1+v2; 行调用 move 赋值,但事实并非如此。相反,它会调用 move 构造函数。

我什至尝试了 Vector v4 = std::move(v2);,但这也没有用并调用了 move 构造函数。

知道为什么没有调用 move 分配吗?

最佳答案

语义上你不是在调用赋值

Vector v4 = v1+v2;

真的是:

Vector v4(v1+v2);

如果没有复制构造函数,但存在默认构造函数和可接受的赋值,则将调用赋值。正如评论你需要做的那样:

Vector v4; v4 = v1 + v2;

有一个真正的任务

关于c++ - 未调用 move 赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21869210/

相关文章:

c++ - 运算符优先级.. () 和++

c++ - 使用 shared_from_this 返回的指针访问私有(private)成员

c++ - 通过 `&&` 传递的参数对非构造函数有用吗?

c++ - 为什么我的代码中没有调用 move 构造函数?

C++ move 语义(和右值引用)与普通引用

c++ - 在 CUDA/Thrust 中,如何在 for-each 操作期间访问 vector 元素的邻居?

C++ 模板参数继承

linux - 是否可以仅针对某些特定的 C++11 代码段 {activate|de-activate} SIGFPE 生成?

c++ - 如何运行一些每 2 秒在不同线程上运行的方法?

c++ - 在 C++11 中使用 decltype() 时出错(在 gcc 4.7.0 中创建不透明的错误消息)