C ++:不调用移动构造函数,除非调用显式强制转换

问题描述

我创建了一个类“ ListElement”,该类包含一个包含动态分配数组的类“ MyClass”的实例作为单个数据变量。

  • 对于ListElement,我创建了一个默认构造函数,该构造函数委派给一个用于初始化MyClass实例的右值构造函数。

  • 对于MyClass,我创建了一个构造函数,该构造函数将其数组初始化为输入的值(以及一个默认构造函数,该数组将值0委托给上述一个构造函数)。此外,我还提供了一个副本和一个move构造函数。

但是,我很困惑,为什么不调用move构造函数,除非将数据类型显式转换为r值引用,尽管它已经这样传递了(见下文)。

#include <iostream>

template <int arrSize>
class MyClass {
private:
  // Data
  int* a;

public:
  //Constructor
  MyClass(int value){
    this->a = new int[arrSize];
    for(unsigned int i = 0; i<arrSize; ++i){
      a[i] = value;
    }
    std::cout << "MyClass created!" << std::endl;
  }
  MyClass(): MyClass(0){}
  //Copy  Constructor
  MyClass(const MyClass<arrSize>& other){
    this->a = new int[arrSize];
    for(unsigned int i = 0; i<arrSize;++i){
      a[i] = other.a[i];
    }
    std::cout << "MyClass copied!" << std:: endl;
  }
  //Move Constructor
  MyClass(MyClass<arrSize>&& other){
    this->a = other.a;
    other.a = nullptr;
    std::cout << "MyClass moved!" << std::endl;
  }
  //Destructor
  ~MyClass(){
    delete[] this->a;
    std::cout << "MyClass deleted!" << std::endl;
  }
};

class ListElement {
public:
  //Constructors
  ListElement(MyClass<5>&& data) : data((MyClass<5>&&)data) {} // QUESTION 
  ListElement(): ListElement(MyClass<5>(1)){}

private:
  //Data
  MyClass<5> data;
};

int main() {
  ListElement myZeroListElement{};
  return 0;
}

问题: 如果我为此行写代码,为什么调用复制构造函数(请参见注释)?

ListElement(MyClass<5>&& data) : data(data) {}

“数据”是一个右值引用,但是仅当我故意将其强制转换为这样的右值引用时,才调用move构造函数:

ListElement(MyClass<5>&& data) : data((MyClass<5>&&)data) {}

非常感谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)