如何移动的对象被使用?

移动对象之后,它必须是destructable:

T obj; func(std::move(obj)); // don't use obj and let it be destroyed as normal

还有什么能与OBJ做什么? 你可以将其他对象成吗?

T obj; func(std::move(obj)); obj = std::move(other);

这是否取决于具体类型? (例如:性病::矢量可以作出具体保证,你不能依赖于所有吨),它是必需的,甚至神志正常,所有类型的支持,除了破坏一些东西感动 - 从对象?

--------------解决方案-------------

是的,你可以将另一个对象进去。 的std ::互换做到这一点。

中的C ++ 0x目前的草案规定,一个感动,从对象可以被毁灭,或分配给。 如果你通过对象的标准库函数然后就是所有的假设。

它通常被认为是好的做法,以确保移动,从对象是同类型的“工作”对象,满足所有的不变量。 但是,它是在一个不确定的状态-如果它是一个容器,你不知道有多少元素它都有,或者它们是什么,但你应该能够调用size()empty()和查询它。

目前的草案是不清楚需要什么标准库类型的自己,并且在C ++的有关委员会活动的讨论。

这类型的语义。 你决定。 这取决于你如何实现移动。

在一般情况下,状态应该是相同的1通过使用非参数的构造获得的。

顺便说一句。 此举使得只有意义,如果你是存储后面的指针(或其他可移动的类)的数据块。

它依赖于类代码。 如果类没有右值引用构造函数和赋值操作符,性病::此举被忽略。 的std ::搬不动任何东西,它只是允许把其作为右值引用参数,如果相应的函数可用。

正确写入&&构造函数和operator =必须离开参数例如在某种一致的状态,如空字符串,对象应该是可用的。 如果运营商=,另一个对象可以被正确地分配给这样的空实例。

编辑。

一般情况下,的std ::此举应可用于应用移动语义变量而不是右值,但实际上它是:

SomeClass的:: SomeClass的(SomeClass的&& V)
{
//在这个函数中的,V不是右值了。 但我知道,其实
//这是右值,并且使用std ::举措
OtherFunction(STD ::移动(V));
}

在这种情况下,极小子要求v是,它应该能够没有问题就不行了。

当性病::移动用于变量,它实际上不是右值引用,说真的,这个变量可用性可能是不确定的。 对于我自己的班,我将确保某种一致性对于这种情况。 对于另一类 - 这取决于具体类的实现,但我不会使用的std ::移动到它们其实不是右值引用的对象。 我真的不知道这是怎么定义的(以及它是否被定义)的标准内。

当我终于从意见的理解。 您应该检查这一点:http://www.boost.org/doc/libs/1_44_0/libs/concept_check/concept_check.htm

这将允许你检查提供作为模板参数的概念(该类型的特征)的类型。 我不知道,如果他们已经有一个用于移动。

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#,C ++ 11移动语义
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.529 (s). 10 q(s)