为什么在这种情况下不调用我的移动构造函数?(首先分配 r 值引用并创建对象)
Why isn't my move constructor called in this case? (Assigning r-value reference first and create object)
(不确定我的帖子标题,对糟糕的标题表示歉意)。我已经实施了以下代码:
#include <iostream>
#include <algorithm>
using namespace std;
class MyIntVector {
public:
MyIntVector() {
m_size = 10;
m_mem = new int[m_size];
for(auto i = 0; i < size(); ++i)
m_mem[i] = 0;
}
MyIntVector(int size) {
m_size = size;
m_mem = new int[m_size];
}
MyIntVector(const MyIntVector& v) {
m_mem = new int[v.size()];
m_size = v.size();
for(auto i = 0; i < v.size(); ++i)
m_mem[i] = v[i];
}
MyIntVector(MyIntVector&& v) {
cout << "Calling move constructor" << std::endl;
m_size = v.size();
m_mem = v.m_mem;
v.m_mem = nullptr;
delete [] v.m_mem;
}
int size() const {return m_size;}
int& operator[](int i) { return m_mem[i];}
int operator[](int i) const { return m_mem[i];}
friend ostream& operator<<(ostream& os, const MyIntVector& v);
protected:
int * getMemPtr() {return m_mem;}
private:
int m_size;
int *m_mem;
};
ostream &operator<<(ostream &os, const MyIntVector &v) {
for (auto i = 0; i < v.size(); ++i)
os << v[i] << " ";
return os;
}
void linear_init(MyIntVector& v) {
for(auto i = 0; i < v.size(); ++i)
v[i] = i + 1;
}
int main(int argc, char** argv) {
MyIntVector&& my_v_2 = MyIntVector(20); //binding R-value to R-value reference
MyIntVector my_v_3(my_v_2);
return 0;
}
在主要的是我初始化了R值参考,然后使用它来初始化另一个对象。但是我期望将移动构造函数调用,但是复制构造函数被称为,任何人都可以解释我为什么吗?
(了解移动语义和R值引用只是一些测试代码)。
要更具体,我想拥有一个参考(在文档中),该引用解释了为什么未调用移动构造器。
简单地说 - 所有具有名称的所有内容都是lvalue。因此,称为rvalue参考,在您的情况下, my_v_2
是一个lvalue。当使用LVALUE移动时,未调用构造函数。为了使它起作用,您必须移动它:
MyIntVector my_v_3(std::move(my_v_2));
相关文章:
- 对具有动态分配的内存和析构函数的类对象的引用
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 我如何通过引用将 c++ 字符串分配给另一个字符串
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 如何在构造函数中构造对象并分配引用
- C++中的可重新分配引用
- 如何分配引用链的末端
- c++ 在 if 语句中分配引用变量
- 为什么不能重新分配引用的目标对象?
- 阻止重新分配引用
- C++ 从传入的引用变量中分配引用变量
- C++可以重新分配引用
- 重新分配C++引用变量
- 有条件地分配引用
- 我们可以在C++中重新分配引用吗
- C++在为指针分配引用时获取临时错误的地址
- 为什么可以在 for 语句中重新分配引用常量
- 如何(优雅地)根据字符别名分配引用成员
- 处理赋值运算符重载;您可以重新分配引用吗?
- 对左值和右值的可分配引用