首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造器被称为什么,它不会移动

构造器被称为什么,它不会移动
EN

Stack Overflow用户
提问于 2017-01-06 00:09:16
回答 1查看 142关注 0票数 2

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

代码语言:javascript
复制
#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;
}

我得到的输出:

代码语言:javascript
复制
Param Constructor
Copy constructor called
After logic
Deconstructor
Deconstructor

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

代码语言:javascript
复制
Param Constructor
Move Constructor // (Missing)
Deconstructor //Deleting instance from createTest (Missing)
Copy constructor called
After logic
Deconstructor
Deconstructor
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-06 00:16:48

实际上调用的是什么构造函数?

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

为什么会发生这种事

编译器避免了临时创建。相反,该对象是在适当的位置构造的,否则它将被移动到该位置。这就是所谓的复制省略。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41496913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档