【发布时间】:2012-11-10 23:42:06
【问题描述】:
我正在测试我的容器包装器是否正确实现了 URef。我能想到的唯一明显的方法是尝试找出一种方法来检测对象是否已移动。
有没有一种很好的测试方法来确保对象没有被复制?还是有另一种方法来测试我想要什么?我更喜欢不需要修改我正在测试的类的解决方案。因为有几十个。
您能否提供更多有关您拥有的信息的信息?比如你的容器是什么,你如何使用它,你能不能修改它等等。也许你可以在不修改你的容器的情况下测试它,而是使用特殊的容器元素类型——它跟踪副本和移动。
几个不同的容器和一些独立的模板函数。大多数情况下,它是 STL 库类型(如 deque、list、map、set 等)的包装器。
【问题讨论】:
-
“搬家”并不是像骑自行车那样的实际活动。相反,所发生的只是一个函数对您的对象有一个可变引用。引用本身并没有做任何事情。它只是编写高效代码的语法基础。
-
我知道
std::move实际上除了返回对内部内容的 r 值引用之外并没有做任何事情。我想问我想要什么的更具体的方式是,"I have an object that I think might have had its innards ripped out; how do I confirm that's actually what happened?" -
我认为可能的唯一方法是直接查看相关操作之前和之后的对象二进制表示,然后
memcmping 这些。 -
基本正确。
reinterpret_cast,然后将memcpy放入缓冲区,然后将memcmp与操作后转换的对象一起使用。如果你的胆子被掏空,某事应该已经改变了。当然,一个类可以使用 pimpl 惯用语并直接从实现中移动,而不是将指针移动到实现,但在这种情况下无论如何你都搞砸了。如果发生这种情况,并且您所讨论的课程提供了明确的移动前后条件以及评估这些条件的方法,那可能是另一种方式(想想.empty()用于容器)。 -
为了将来参考,内存检查并非在所有情况下都有效。使用接受的答案。
标签: c++ c++11 move-semantics universal-reference