c ++ 11为什么这个移动构造函数不工作? [英] c++11 Why doesn't this move constructor work?
问题描述
我写了下面的代码。我希望在 LargeClass
的实例之间移动向量的内容。移动构造函数正在使用,但不是移动我只获得副本。
为什么移动语义在这里不起作用?
代码:
#include< iostream&
#include< vector>
class LargeClass
{
public:
explicit LargeClass(void):numbers(20,10)
{
}
LargeClass(const LargeClass& rhs):numbers(rhs.numbers)
{
std :: cout< Using LargeClass copy constructor<< '\\\
';
}
LargeClass(const LargeClass&& rhs):numbers(std :: move(rhs.numbers))
{
std :: cout< Using LargeClass move constructor<< '\\\
';
}
const int * getNumbersAddress(void)const
{
return(numbers.data());
}
private:
std :: vector< int>数字;
};
int main()
{
LargeClass l1;
std :: cout<< l1 vector address:<< l1.getNumbersAddress()<< '\\\
';
LargeClass l2(l1);
std :: cout<< l1 vector address:<< l1.getNumbersAddress()<< '\\\
';
std :: cout<< l2 vector address:<< l2.getNumbersAddress()<< '\\\
';
LargeClass l3 = std :: move(l2);
std :: cout<< l1 vector address:<< l1.getNumbersAddress()<< '\\\
';
std :: cout<< l2 vector address:<< l2.getNumbersAddress()<< '\\\
';
std :: cout<< l3 vector address:<< l3.getNumbersAddress()<< '\\\
';
return 0;
}
可能的输出:
l1向量地址:0x18ce010
使用LargeClass复制构造函数
l1向量地址:0x18ce010
l2向量地址:0x18ce070
使用LargeClass移动构造函数
l1矢量地址:0x18ce010
l2矢量地址:0x18ce070
l3矢量地址:0x18ce0d0
右值引用在它们的 const
表单中没有意义,因为你想修改它们到移动)。在C ++中创建为 const
的对象在只读存储器中,从中无法获取/修改内部资源。
移动构造函数的语法 通常应为
-
class_name(class_name&&)
所以使用:
LargeClass(LargeClass&& rhs)
I've written the code posted below. I was hoping to get to move the content of a vector between instances of LargeClass
. The move constructor is being used, but instead of moving I get copies only.
Why doesn't the move semantics work as expected here?
Code:
#include <iostream>
#include <vector>
class LargeClass
{
public:
explicit LargeClass (void): numbers(20, 10)
{
}
LargeClass (const LargeClass &rhs): numbers(rhs.numbers)
{
std::cout << "Using LargeClass copy constructor" << '\n';
}
LargeClass (const LargeClass &&rhs): numbers(std::move(rhs.numbers))
{
std::cout << "Using LargeClass move constructor" << '\n';
}
const int* getNumbersAddress(void) const
{
return (numbers.data());
}
private:
std::vector<int> numbers;
};
int main()
{
LargeClass l1;
std::cout << "l1 vector address: " << l1.getNumbersAddress() << '\n';
LargeClass l2(l1);
std::cout << "l1 vector address: " << l1.getNumbersAddress() << '\n';
std::cout << "l2 vector address: " << l2.getNumbersAddress() << '\n';
LargeClass l3 = std::move(l2);
std::cout << "l1 vector address: " << l1.getNumbersAddress() << '\n';
std::cout << "l2 vector address: " << l2.getNumbersAddress() << '\n';
std::cout << "l3 vector address: " << l3.getNumbersAddress() << '\n';
return 0;
}
Possible output:
l1 vector address: 0x18ce010
Using LargeClass copy constructor
l1 vector address: 0x18ce010
l2 vector address: 0x18ce070
Using LargeClass move constructor
l1 vector address: 0x18ce010
l2 vector address: 0x18ce070
l3 vector address: 0x18ce0d0
The rvalue references don't make sense in their const
forms because you want to modify them (you want to "move" them ). Objects created as const
in C++ are in read-only memory, from which grabbing/modifying internal resources won't be possible.
The syntax for move constructor normally should be
class_name ( class_name && )
So use :
LargeClass ( LargeClass&& rhs )
这篇关于c ++ 11为什么这个移动构造函数不工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!