首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用C++移动构造函数

未调用C++移动构造函数
EN

Stack Overflow用户
提问于 2017-11-27 20:54:30
回答 1查看 861关注 0票数 0

在下面的(借来的)示例中,在我的环境中从未调用移动构造函数:

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

class MyClass {
  public:
      MyClass()
      {
          std::cout << "default constructor\n";
      }
      MyClass(MyClass& a)
      {
          std::cout << "copy constructor\n";
      }

      MyClass(MyClass&& b)
      {
          std::cout << "move constructor\n";
      } 
};  

void test(MyClass&& temp)
{
    MyClass a(MyClass{}); // calls MOVE constructor as expected
    MyClass b(temp); // calls COPY constructor...  
}

int main()
{
    test(MyClass{});
    return 0;
}

我的输出是:默认构造函数默认复制构造函数

我使用的是XCode版本9.1,是不是应该在rvalue引用上调用移动构造函数?我在这里错过了什么?

约翰。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-27 20:56:41

我在这里错过了什么?

问题是,所有有名字的东西都是lvalue。

这意味着命名的rvalue引用本身是lvalue,temp来自:

代码语言:javascript
复制
void test(MyClass&& temp)

也是不值钱的。因此,不调用move构造函数。

如果要调用移动构造函数,请使用std::move

代码语言:javascript
复制
void test(MyClass&& temp)
{
    // ...
    MyClass b(std::move(temp)); // use std::move here 
}

顺便说一下,

代码语言:javascript
复制
 MyClass(MyClass& a)
 {
     std::cout << "copy constructor\n";
 }

不是复制构造函数,因为复制构造函数的形式为:

代码语言:javascript
复制
MyClass(const MyClass& a) { ... }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47519641

复制
相关文章

相似问题

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