一个有关拷贝构造函数和移动构造函数的问题

本人在学习拷贝构造函数和移动构造函数时有个疑问,用以下代码创建5个实例,为什么会调用6次析构函数?

#include 

class Int
{
private:
    int b = 10;
    int* a = &b;
public:
    Int() = default;
    Int(int a)
    {
        std::cout << "构造" << std::endl;
        this->a = &a;
    }
    Int(const Int& arg){
        std::cout << "拷贝构造" << std::endl;
        this->a = arg.a;
    }
    Int(Int&& arg) noexcept
    {
        std::cout << "移动构造" << std::endl;
        this->a = arg.a;
        arg.a = nullptr;
    }
    Int operator=(Int& arg)
    {
        std::cout << "拷贝赋值" << std::endl;
        if(this != &arg)
            this->a = arg.a;
        return *this;
    }
    Int& operator=(Int&& arg) noexcept
    {
        std::cout << "移动赋值" << std::endl;
        if(this != &arg)
            this->a = arg.a;
            arg.a = nullptr;
        return *this;
    }
    ~Int(){std::cout << "删除" << std::endl;}
};

int main()
{
    Int a1 = 10;
    Int a2 = a1;

    Int a3 = std::move(a1);
    Int a4;
    a4 = std::move(a2);
    Int a5;
    a5 = a3;
}

输出结果如下:
构造
拷贝构造
移动构造
移动赋值
拷贝赋值
拷贝构造
删除
删除
删除
删除
删除
删除
有人可以解答一下吗

return *this; 会产生一个隐式变量
删除a5 = a3;试试,是否两次删除

问题已解决,只要把28行的拷贝赋值运算符改为Int& operator=(Int& arg)即可,这样不会多生成一个临时的this指向的实例