移动构造函数在C ++ 0x没有被调用 [英] Move constructor is not getting called in C++0x

查看:187
本文介绍了移动构造函数在C ++ 0x没有被调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请在下面找到我的代码,我已经习惯了调用move constructor(代码从其他网站启发),让我知道它是什么问题,我使用GCC 4.5.3

Please find my code below, I have used to call move constructor (code Inspired from other sites)and let me know whats wrong with it, I am using GCC 4.5.3

#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构造函数。

When we use std::move while constructing, it is calling move constructor.

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当我们找不到地址空间或对它们的引用时,返回值变为右值。

But even if we do not use, gerMove_Constructor and square return values becomes rvalue while constructing object as we can not find address space or reference to them,

请让我知道如果我的理解有问题,移动构造函数不被调用。

Please let me know if something is wrong in my understanding, if not then why move constructor is not called.

感谢提前。
Satya

Thanks In Advance. Satya

推荐答案

当按照值返回一个局部变量时,编译器仍允许复制构造函数,如C ++ 03(返回值优化)。

When returning a local variable by value, the compiler is still allowed to elide copy constructors as in C++03 (return value optimization).

这篇关于移动构造函数在C ++ 0x没有被调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆