Xan*_*anx 6 move-semantics c++11
我正在尝试使用移动语义(就像一个实验).这是我的代码:
class MyClass {
public:
MyClass(size_t c): count(c) {
data = new int[count];
}
MyClass( MyClass&& src) : count(src.count) {
data = src.data;
src.count = 0;
src.data = nullptr;
}
void operator=( MyClass&& src) {
data = src.data;
count = src.count;
src.count = 0;
src.data = nullptr;
}
~MyClass() {
if (data != nullptr)
delete[] data;
}
int* get_data() const {
return data;
}
size_t get_count() const {
return count;
}
private:
MyClass(const MyClass& src) : count(src.count) {
data = new int[src.count];
memcpy(data, src.data, sizeof(int)*src.count);
}
void operator=(const MyClass& src) {
count = src.count;
data = new int[src.count];
memcpy(data, src.data, sizeof(int)*src.count);
}
int* data;
size_t count;
};
int main()
{
MyClass mc(150);
for (size_t i = 0; i < mc.get_count(); ++i)
mc.get_data()[i] = i;
MyClass &&mc2 = std::move(mc);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是std :: move不会将mc移动到mc2,它只是复制(copyies指针就是这样).如果我删除复制构造函数编译器为MyClass生成它.
我如何强制使用移动语义?如何使它在这种结构中使用:
MyClass mc2(mc); //Move, not copy
-or-
MyClass mc2 = mc; //Move, not copy
Run Code Online (Sandbox Code Playgroud)
我试图使用'&&'运算符来明确标记rvalue,但是,原因是它不起作用.
你声明m2作为参考,不能作为价值。因此,它仍然指的是初始化时的内容m1。您想要这样:
MyClass mc2 = std::move(mc);
Run Code Online (Sandbox Code Playgroud)
至于第二部分,则无法强制执行以下结构:
MyClass mc2(mc); //Move, not copy
//-or-
MyClass mc2 = mc; //Move, not copy
Run Code Online (Sandbox Code Playgroud)
移动。如果要从左值(mc实际上是左值)移动,则必须std::move显式使用(或将另一类型转换为右值)。
您可以做一件事,但这将是肮脏的hack,会使代码不直观,并成为bug的重要来源。您可以使用非const引用添加复制构造函数(和复制赋值运算符)的重载,从而完成此操作。基本上std::auto_ptr,以前应该做过类似的事情。但是,例如,它永远不会通过代码审查。如果您想移动,只需std::move。
一些注意事项:
确保在空指针上调用delete或是delete[]空操作,因此可以安全地if从析构函数中删除。
通常最好在C ++代码中使用,std::copy而memcpy不用担心得到sizeof正确的代码
| 归档时间: |
|
| 查看次数: |
3738 次 |
| 最近记录: |