首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Move语义和std::move

Move语义和std::move
EN

Stack Overflow用户
提问于 2022-09-01 08:19:09
回答 3查看 153关注 0票数 2

我有一个关于移动语义的一般性问题。昨天,我只是四处游玩,以便对这个话题感到更舒服。在这里,我添加了复制和移动构造函数操作符,只需登录到控制台:

代码语言:javascript
复制
#include <iostream>

class Test {    
public:
  const char* value = "HI";
  Test(){
     std::cout << "Default Constructed\n";
  }
  Test(Test &&source) { 
     std::cout << "Move Constructed\n";
  }
  Test(const Test &source) {
     std::cout << "Copy Constructed\n";
  }
};    

现在当我打电话

代码语言:javascript
复制
void showMe(Test&& test) {
  std::cout << test.value;
}

int main() {
  Test test1;
  // Test test2{test1};
  showMe(std::move(test1));

  return 0;
}

控制台注销:

默认构造的

HI

这一点对我来说很清楚,因为我们只是将所有权转移到showMe。但是为什么未调用Test的move构造函数运算符?

但是现在,如果我将showMe函数改为

代码语言:javascript
复制
void showMe(Test test) {
  std::cout << test.value;
}

控制台显示:

默认构造的

Move构造

HI

所以我的问题是,为什么移动构造器操作符在第一种情况下没有执行,而在第二种情况下呢?我通常认为在第一种情况下,Test的move操作符应该执行。这两宗个案有何分别?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-09-01 08:22:11

,但是为什么未调用测试的move构造函数运算符?

因为您一直通过对rvalue的引用对同一个对象进行操作。没有新的对象正在构建,因此不需要构造函数。

可以想象,您可以继续向下传递该引用,就像对const的常规引用或引用一样--引用的本质就是它们不是对象。

在第二个示例中,函数的参数是一个值,为了构造该值,第二个构造函数需要触发。

票数 3
EN

Stack Overflow用户

发布于 2022-09-01 08:21:51

首先,您传递一个引用。因此,不需要创建新的对象。

票数 1
EN

Stack Overflow用户

发布于 2022-09-01 10:00:24

在void中,showMe( test )形式参数期望通过值传递,所以这就是迁移构造\get被调用的原因(传递值意味着参数被复制到函数中)。调用移动构造函数) .in第二种情况下,showMe(测试&测试)形式参数期望引用传递,因此没有创建新对象,也没有调用构造函数

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

https://stackoverflow.com/questions/73566210

复制
相关文章

相似问题

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