c++ - 什么构造函数被调用,它不是移动

标签 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

最佳答案

what constructor is actually being called?

根本没有构造函数。计算析构函数调用的次数。你会发现比你想象的少了一个。您期望构建的临时对象根本没有创建。

Why is this happening

编译器避免创建临时文件。取而代之的是,该对象是在它本来会被移动到的地方 build 的。这称为复制省略。

关于c++ - 什么构造函数被调用,它不是移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41496913/

相关文章:

c++ - QT - 空 QLineEdits 在写入 SQL 数据库时未作为 NULL 传递

c++ - 需要使用私有(private)继承的设计帮助

c++ - pthread_setschedprio() 失败并显示 "EINVAL"

c++ - 使用 std::try_to_lock 的意外行为

Eclipse 上的 C++11 完全支持

c++ - 在 STL 列表中输出一个元组

c++ - 覆盖复制/move 分配重载时是否需要删除当前成员数据?

c++ - 如何使用 map 从 CPP 中带有 vector 的文件中获取唯一值?

C++ toString 成员函数和 ostream 运算符 << 通过模板集成

c++ - C++ 11中的boost::thread_group?