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());什么叫复制赋值?什么都没有?只有两个对象的构造函数和析构函数,本地对象和主函数中的一个。