请在下面找到我的代码,我曾经调用移动构造函数(代码灵感来自其他网站)并让我知道它有什么问题,我使用的是GCC 4.5.3 #include iostream#include vectorclass Int_Smart_Pointer { int *m_p;public: Int_Smart_
#include <iostream> #include <vector> class Int_Smart_Pointer { int *m_p; public: Int_Smart_Pointer() { std::cout<<"Derfault Constructor"<< std::endl; m_p = NULL; } explicit Int_Smart_Pointer(int n) { std::cout<<"Explicit Constructor: " << n <<std::endl; m_p = new int(n); } Int_Smart_Pointer(const Int_Smart_Pointer& other) { std::cout<<"Copy Constructor: "<<std::endl; if(other.m_p) m_p = new int(*other.m_p); else m_p = NULL; } Int_Smart_Pointer(Int_Smart_Pointer&& other) { std::cout<<"Move Constructor: "<<std::endl; m_p = other.m_p; other.m_p = NULL; } Int_Smart_Pointer& operator=(const Int_Smart_Pointer& other) { std::cout<<"Copy Assignment"<< std::endl; if(this != &other) { delete m_p; if(other.m_p) m_p = new int(*other.m_p); else m_p = NULL; } return *this; } Int_Smart_Pointer& operator=(Int_Smart_Pointer&& other) { std::cout<<"Move Assignment"<< std::endl; if(this != &other) { delete m_p; m_p = other.m_p; other.m_p = NULL; } return *this; } ~Int_Smart_Pointer() { std::cout<<"Default Destructor"<< std::endl; delete m_p; } int get() const{ if(m_p) return *m_p; else return 0; } }; Int_Smart_Pointer square(const Int_Smart_Pointer& r) { const int i = r.get(); return Int_Smart_Pointer(i * i); } Int_Smart_Pointer getMove_Constructor() { return Int_Smart_Pointer(100); } int main() { Int_Smart_Pointer a(10); Int_Smart_Pointer b(a); b = square(a); std::cout<< std::endl; Int_Smart_Pointer c(30); Int_Smart_Pointer d(square(c)); //Move constructor Should be called (rvalue) std::cout<< std::endl; Int_Smart_Pointer e(getMove_Constructor()); //Move constructor Should be called (rvalue) std::cout<< std::endl; std::vector<Int_Smart_Pointer> ptr_vec; ptr_vec.push_back(getMove_Constructor()); ptr_vec.push_back(getMove_Constructor()); std::cout<< std::endl; return 0; }
输出是
Explicit Constructor: 10 Copy Constructor: Explicit Constructor: 100 Move Assignment Default Destructor Explicit Constructor: 30 Explicit Constructor: 900 Explicit Constructor: 100 Explicit Constructor: 100 Move Constructor: Default Destructor Explicit Constructor: 100 Move Constructor: Move Constructor: Default Destructor Default Destructor Default Destructor Default Destructor Default Destructor Default Destructor Default Destructor Default Destructor Default Destructor
当我们在构造时使用std :: move时,它正在调用move构造函数.
Int_Smart_Pointer d(std::move(square(c))); //used std::move and Move constructor called Int_Smart_Pointer e(std::move(getMove_Constructor())); //used std::move works as above
但即使我们不使用,gerMove_Constructor和square返回值在构造对象时变为rvalue,因为我们找不到地址空间或对它们的引用,
如果我的理解有问题,请告诉我,如果没有,那么为什么不调用移动构造函数.
提前致谢.
萨蒂亚