2014-12-30 2 views
1

я не могу получить двигаться семантикой и rvalues, я буду размещать код первым, а затем спросить:Почему уступка движения не называется здесь

#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; 
} 

У меня есть конкретный вопрос, почему Переместить назначение не называются здесь, когда я вызывать функцию createObject, isn`t объект, возвращаемый функцией Rvalue, если это Rvalue, он должен вызывать назначение перемещения в классе?

+0

@AlexFarber RVO не будет применяться, поскольку это назначение, а не инициализация, не так ли? – Pradhan

+0

try s = std :: move (createObject()); – user1810087

+1

А что называется? Копировать назначение? Ничего? – kraskevich

ответ

4

Оператор присваивания переходов действительно называется. Однако в operator=(Spred&&) вы вызываете cout после return *this;. После изменения его

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; 
     } 

вы увидите выход

Constructor() 
Constructor() 
Move assignment 
Destructor() 
Destructor() 

, как вы ожидаете.

Смежные вопросы