正在调用什么构造函数,它不会移动

时间:2017-01-06 00:09:16

标签: c++ c++11

我创建了一个基本的测试类来学习移动构造函数的工作原理。似乎没有调用移动构造函数,我不确定实际调用的是什么构造函数。如果我使用std :: move然后调用移动构造函数,但是常规R值实际上不会调用它。为什么会发生这种情况,实际调用的构造函数是什么?我正在使用g ++ 4.6.3

#include <iostream>
#include <cstring>

class Test
{
  int a;
  int b;
  int* c;

public:
  Test(int one, int two)
  {
    std::cout << "Param Constructor" << "\n";
    a = one;
    b = two;
  }

  Test()
  {
    std::cout << "Default Constructor" << "\n";
    a = 1;
    b = 2;
  }

  ~Test()
  {
    std::cout << "Deconstructor" << "\n";
  }

  Test(const Test& test)
  {
    a = test.a;
    b = test.b;
    std::cout << "Copy constructor called" << "\n";
  }

  Test(Test&& test)
  {
    std::cout << "Move constructor called" << "\n";
    a = test.a;
    b = test.b;
  }

  Test& operator=(const Test& test)
  {
    std::cout << "in operator=" << "\n";
    a = test.a;
    b = test.b;
    return *this;
  }
};

Test createTest()
{
  return Test(1,2);
}

int main()
{
  Test test(createTest());
  Test test2 = test;
  std::cout << "After logic" << "\n";
  return 0;
}

我得到的输出:

Param Constructor
Copy constructor called
After logic
Deconstructor
Deconstructor

我使用名称test创建了一个Test类型的对象,但是没有创建它的输出?我期待这个输出:

Param Constructor
Move Constructor // (Missing)
Deconstructor //Deleting instance from createTest (Missing)
Copy constructor called
After logic
Deconstructor
Deconstructor

1 个答案:

答案 0 :(得分:8)

  

实际上正在调用什么构造函数?

根本没有构造函数。计算析构函数调用的数量。您会发现有一个比您预期的少。你想要建造的临时建筑根本就没有建造。

  

为什么会发生这种情况

编译器避免创建临时文件。相反,该对象是在原本将被移动的位置构建的。这被称为复制省略。