问题描述
我创建了一个类“ 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 (将#修改为@)