0
#include <iostream>
static int i=0;
using namespace std;
class Movable
{
public:
Movable():mId(++i){
cout<<"constructing it "<<mId<<endl;
};
Movable (const Movable&)=delete;
Movable (Movable&)=delete;
void operator=(Movable&)=delete;
void operator=(const Movable&)=delete;
Movable (const Movable&& aObject)
{
cout<<"Moving it constant "<<mId<<endl;
// mId=++i;
};
Movable (Movable&&aObject)
{
cout<<"Moving it "<<mId<<endl;
};
Movable &operator=(Movable&&aObject)
{
cout<<"Moving it assignment "<<mId<<endl;
return *this;
}
Movable &operator=(const Movable&&aObject)
{
cout<<"Moving it assignment constant "<<mId<<endl;
return *this;
}
~Movable()
{
cout<<"destroying it "<<mId<<endl;
}
int getId() const {
return mId;
}
private:
int mId;
};
Movable&& CreatenNewMovable()
{
Movable lM;
return std::move(lM);
}
int main() {
Movable a;
a=CreatenNewMovable();
return 0;
}
這段代碼的輸出結果是對象銷燬
constructing it 1
constructing it 2
destroying it 2
Moving it assignment 1
destroying it 1
我是一個有點困惑怎麼可能摧毀臨時對象,然後第二移動它。這是一個未定義的行爲?我錯過了關於移動操作的東西?
我改變了功能 Movable CreateNewMovable() { \t Movable lM; \t return lM;現在 其構建1 其構建2 移動它分配1 摧毀2 毀壞它1. 這意味着該對象被移動然後破壞 } 輸出。 與複製操作有什麼不同? –
對於所討論的類而言,如果移動的執行效率比複製的效率更高,它就不同了。在例如一個std :: vector,移動操作的效率更高,因爲它不分配新的內存,並且不會複製或移動所有的成員對象 - 移動通過「盜取」對象擁有的指針來工作從...移開。 –
你可能想看看這裏:http://stackoverflow.com/questions/3106110/what-are-move-semantics?rq=1和在這裏:http://stackoverflow.com/questions/6943805/are-moved-從對象要求的將要-自毀?RQ = 1 –