检查容器上是否完成了std::move
Check if std::move is done on container
有什么方法可以检查在STL容器上是否执行了std::move?
我有两种类型的类(比方说A和B),它们在内部容器中保留了另一个类的(一些)实例。如果A的实例将B的实例保留在它的容器中,那么B的实例也必须将A的相同实例保留在其容器中。
A可以看到B的私有方法(B把它当作它的朋友),但我必须在B上实现move构造函数。因为B可以看到这两个类的内部容器,所以我已经实现了B为这两个类别执行所有添加和删除操作。
问题是:
我必须为A实现move构造函数,并在该容器上使用stl::move。在容器移动到A的新实例后,通知B旧类分离的唯一方法是通过使用B和旧A的容器并对这两个类进行移除的方法
有没有办法让B知道旧A的容器被移动了,它不应该访问它
它不需要检查就可以工作,但由于类在std::move之后没有定义状态,我不应该对它调用:remove()(教授说这是一个错误)
请注意:这是我的家庭作业问题,所以我不想得到解决完整问题的非法帮助,只想在移动对象后跳过调用它的函数来检查对象的一致性。
EDIT:添加了示例
重要:
1) 我被要求使用std::move。我已经知道使用迭代器在while循环中执行所有操作的简单方法。但是,std::move是明确要求的
2) 这个片段是为了理解我的问题。作为一名学生,我想自己解决这个问题,我只需要知道如何在不允许的情况下跳过一行。
class A;
class B {
public:
// ...... some constructors, functions and destructor.
void add(A *a) {
// .. adds to both containers.
};
void remove(A *a) { // I need to remove from both containers at most of the times
a_container.erase(a);
a->b_container.erase(this); // PROBLEM(!!): after doing std::move(b_container) I shouldn't do this! How to check is b_container moved?
};
private:
std::_______<A*> a_container; //type of container is not important
};
class A {
friend class B;
public:
// ...... some constructors, functions and destructor.
A(A && a) :
b_container(std::move(a.b_container)) {
//..
for (B *b : b_container) {
b->add(this); //adds to B's connected to the old instance
a.remove(*b); //I need somehow to disconect old B's from pointer of moved A.
}
};
void add(B & b) {
b.add(this);
};
void remove(B & b) {
b.remove(this);
};
private:
std::_______<B*> b_container; //type of container is not important
//...
};
有什么方法可以检查一下在STL容器上是否完成了std::move?
std::move模板不会移动任何东西,它只是
获取对其参数的右值引用,并将其转换为xvalue。
如果编译了类似于b_container(std::move(a.b_container))
的代码,那么std::move
"工作",b_container
有一个移动构造函数,移动构造函数移动指定为参数的对象的内部。否则,代码不可编译。由于缺少移动构造函数,以下示例不可编译。这是在科利鲁。
#include <utility>
class B {
public:
B() = default;
B(B &&) = delete;
};
int main() {
B b0;
B b1(std::move(b0));
return 0;
}
对以上文本进行总结。std::move
始终"有效"。
移动对象的状态未指定。链接#00和链接#01解释了这种行为。
有没有办法让B知道旧A的容器被移动了,它不应该访问它?
无法检查旧容器是否移动,即检查其状态。但是可以访问它,例如,调用std::vector::empty
方法,因为对象是有效的。有关说明,请参阅此链接。
- Usages of std::move
- 在C++中对T*类型执行std::move的意外行为
- 关于std::move的使用,是否有编译警告
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 通过实例理解std::move及其目的
- 返回一个带有 std::move 的对象并链接函数
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- std::move a const std::vector in a lambda capture
- "std::forward"和"std::move"真的不生成代码吗?
- 如何在没有 std::move 的情况下移动临时对象
- 关于在成员重载中使用 std::move() 的问题
- 显式清除 std::move 之后的源资源
- std::move 如何使原始变量的值无效?
- 复制elision、std::move和链式函数调用
- 如果真的需要std::move,我们应该什么时候声明右值refs
- 使用std::move将std::unique_ptr作为qt信号参数传递
- 无法使用带有 std::move 的自定义删除器插入 std::unique_ptr
- C++:我应该在 return 语句中显式使用 std::move() 来强制移动吗?
- 编译器是否足够聪明,以至于 std::move 变量超出范围?
- std::move() 或其在局部变量上的显式等价物可以允许 elision 吗?