为什么在这种情况下不调用我的移动构造函数? (首先分配 r-value 引用并创建 object)
Why isn't my move constructor called in this case? (Assigning r-value reference first and create object)
(不确定我的 post 的标题,为糟糕的标题道歉)。
我已经实现了以下代码:
#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-value 引用,稍后我用它来初始化另一个 object。然而我期待移动构造函数被调用,但是复制构造函数被调用,谁能解释为什么?
(这只是一些理解移动语义和r-value引用的测试代码)。
更具体地说,我希望有一个参考(在文档中)解释为什么不调用移动构造函数。
简单地说 - 任何有名字的东西都是左值。因此,命名为右值引用,在您的情况下 my_v_2
是一个左值。并且在使用左值时不调用移动构造函数。要使其工作,您必须移动它:
MyIntVector my_v_3(std::move(my_v_2));
(不确定我的 post 的标题,为糟糕的标题道歉)。 我已经实现了以下代码:
#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-value 引用,稍后我用它来初始化另一个 object。然而我期待移动构造函数被调用,但是复制构造函数被调用,谁能解释为什么?
(这只是一些理解移动语义和r-value引用的测试代码)。
更具体地说,我希望有一个参考(在文档中)解释为什么不调用移动构造函数。
简单地说 - 任何有名字的东西都是左值。因此,命名为右值引用,在您的情况下 my_v_2
是一个左值。并且在使用左值时不调用移动构造函数。要使其工作,您必须移动它:
MyIntVector my_v_3(std::move(my_v_2));