C++ 为什么这里不调用移动分配

C++ 为什么这里不调用移动分配,c++,C++,我无法获得移动语义和右值,我将先发布代码,然后询问: #include <iostream> #include <vector> #include <string> #include <stdlib.h> using namespace std; class Spred{ public: Spred(int siz=10):sz{siz},ptrtoint{new int[siz]},c{0} {cout<<"

我无法获得移动语义和右值,我将先发布代码,然后询问:

#include <iostream>
#include <vector>
#include <string>
#include <stdlib.h>
using namespace std;

class Spred{
    public:
        Spred(int siz=10):sz{siz},ptrtoint{new int[siz]},c{0} {cout<<"Constructor()"<<endl;}

        ~Spred(){delete [] ptrtoint;cout<<"Destructor()"<<endl;}
        Spred(Spred& src){
            ptrtoint=new int[src.sz];
            for(int i=0;i<src.c;i++)
                ptrtoint[i]=src.ptrtoint[i];
            sz=src.sz;c=src.c;
            cout<<"Copy constructor"<<endl;
        }
        Spred& operator=(Spred &src){
            delete [] ptrtoint;
            sz=src.sz;
            c=src.c;
            ptrtoint=new int[sz];
            for(int i=0;i<c;i++)
                ptrtoint[i]=src.ptrtoint[i];
            return *this;
            cout<<"Copy assignment"<<endl;
        }
        Spred(Spred&& src){
            ptrtoint=new int[src.sz];
            for(int i=0;i<src.c;i++)
                ptrtoint[i]=src.ptrtoint[i];
            sz=src.sz;c=src.c;
            delete [] src.ptrtoint;
            src.ptrtoint=nullptr;
            src.sz=0;src.c=0;
            cout<<"Move constructor"<<endl;
        }
        Spred& operator=(Spred&& src){
            delete [] ptrtoint;
            ptrtoint=new int[src.sz];
            sz=src.sz;c=src.c;
            for(int i=0;i<c;i++)
                ptrtoint[i]=src.ptrtoint[i];
            delete [] src.ptrtoint;
            src.ptrtoint=nullptr;
            src.sz=0;src.c=0;
            return *this;
            cout<<"Move assignment"<<endl;
        }
        void push_back(int a){
            ptrtoint[c++]=a;
        }
        friend ostream& operator<<(ostream& os,Spred &src){
            for(int i=0;i<src.c;i++){
                os<<src.ptrtoint[i]<<" ";
            }
            return os;
        }
    private:
        int *ptrtoint;
        int sz;int c;
};
Spred createObject(){
    return Spred(15);
}
int main()
{

    Spred s;
    s=createObject();
    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
课堂讨论{
公众:

Spred(intsiz=10):sz{siz},ptrtoint{newint[siz]},c{0}{cout确实调用了移动赋值操作符。但是,在
操作符=(Spred&&)
中,在
返回*this;
之后调用
cout

Spred& operator=(Spred&& src){
            delete [] ptrtoint;
            ptrtoint=new int[src.sz];
            sz=src.sz;c=src.c;
            for(int i=0;i<c;i++)
                ptrtoint[i]=src.ptrtoint[i];
            delete [] src.ptrtoint;
            src.ptrtoint=nullptr;
            src.sz=0;src.c=0;
            cout<<"Move assignment"<<endl;
            return *this;
        }

正如您所料。

确实调用了移动分配操作符。但是,在
操作符=(Spred&&)
中,您在
返回*this;
之后调用
cout

Spred& operator=(Spred&& src){
            delete [] ptrtoint;
            ptrtoint=new int[src.sz];
            sz=src.sz;c=src.c;
            for(int i=0;i<c;i++)
                ptrtoint[i]=src.ptrtoint[i];
            delete [] src.ptrtoint;
            src.ptrtoint=nullptr;
            src.sz=0;src.c=0;
            cout<<"Move assignment"<<endl;
            return *this;
        }

正如您所料。

@AlexFarber RVO不会应用,因为它是一个赋值而不是初始化,对吗?请尝试s=std::move(createObject());什么叫做?复制赋值?什么都没有?只有两个对象的构造函数和析构函数,本地对象和主函数中的一个。@AlexFarber RVO不适用,因为它是赋值而不是初始化,对吗?请尝试s=std::move(createObject());什么叫复制赋值?什么都没有?只有两个对象的构造函数和析构函数,本地对象和主函数中的一个。