检查 std::move 是否在容器上完成
Check if std::move is done on container
有什么方法可以检查 std::move 在某些 STL 容器上完成了吗?
我有两种类型的 classes(比如说 A 和 B),它们将另一个 class 的(一些)实例保存在它们的内部容器中。如果 A 的实例在其容器中保留 B 的实例,则 B 的实例也必须在其容器中保留相同的 A 实例。
A 可以看到 B 的私有方法(B 有它,因为它是朋友),但我必须在 B 上实现移动构造函数。因为 B 可以看到两者的内部容器,所以我实现了 B 为两者添加和删除classes.
问题是:
我必须为 A 实现移动构造函数,并在该容器上使用 stl::move。将容器移动到 A 的新实例后,通知 B 分离旧 class 的唯一方法是通过使用 B 和旧 A 的容器并为两个 class 执行删除的方法。
B 有什么方法可以知道旧 A 的容器已移动并且它不应该访问它?
它无需检查即可工作,但由于 class 在 std::move 之后没有定义状态,我不应该对其调用 ::remove() (教授说这是一个错误)。
请注意:这是我的作业问题,所以我不想得到解决完整问题的非法帮助,只是检查对象的一致性部分以跳过移动后调用它的函数。
编辑:添加示例。
重要:
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
//...
};
Is there any way I can check is std::move done on some STL container?
std::move模板没有动任何东西,它只是
obtains an rvalue reference to its argument and converts it to an
xvalue.
如果编译类似于 b_container(std::move(a.b_container))
的代码,则 std::move
"works" 和 b_container
具有移动构造函数并且移动构造函数移动指定对象的内部作为参数。否则代码不可编译。由于缺少移动构造函数,以下示例不可编译。 Here 它在 coliru 上。
#include <utility>
class B {
public:
B() = default;
B(B &&) = delete;
};
int main() {
B b0;
B b1(std::move(b0));
return 0;
}
总结以上文字。 std::move
"works" 总是。
移动对象的状态未指定。 Link#00 and Link#01 解释这种行为。
Is there any way for B to know that old A's container is moved and it shouldn't access it?
无法检查旧容器是否移动,即检查它是否处于状态。但是可以访问它,例如调用 std::vector::empty
方法,因为该对象是有效的。有关解释,请参阅 this link。
有什么方法可以检查 std::move 在某些 STL 容器上完成了吗?
我有两种类型的 classes(比如说 A 和 B),它们将另一个 class 的(一些)实例保存在它们的内部容器中。如果 A 的实例在其容器中保留 B 的实例,则 B 的实例也必须在其容器中保留相同的 A 实例。
A 可以看到 B 的私有方法(B 有它,因为它是朋友),但我必须在 B 上实现移动构造函数。因为 B 可以看到两者的内部容器,所以我实现了 B 为两者添加和删除classes.
问题是:
我必须为 A 实现移动构造函数,并在该容器上使用 stl::move。将容器移动到 A 的新实例后,通知 B 分离旧 class 的唯一方法是通过使用 B 和旧 A 的容器并为两个 class 执行删除的方法。
B 有什么方法可以知道旧 A 的容器已移动并且它不应该访问它?
它无需检查即可工作,但由于 class 在 std::move 之后没有定义状态,我不应该对其调用 ::remove() (教授说这是一个错误)。
请注意:这是我的作业问题,所以我不想得到解决完整问题的非法帮助,只是检查对象的一致性部分以跳过移动后调用它的函数。
编辑:添加示例。
重要:
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
//...
};
Is there any way I can check is std::move done on some STL container?
std::move模板没有动任何东西,它只是
obtains an rvalue reference to its argument and converts it to an xvalue.
如果编译类似于 b_container(std::move(a.b_container))
的代码,则 std::move
"works" 和 b_container
具有移动构造函数并且移动构造函数移动指定对象的内部作为参数。否则代码不可编译。由于缺少移动构造函数,以下示例不可编译。 Here 它在 coliru 上。
#include <utility>
class B {
public:
B() = default;
B(B &&) = delete;
};
int main() {
B b0;
B b1(std::move(b0));
return 0;
}
总结以上文字。 std::move
"works" 总是。
移动对象的状态未指定。 Link#00 and Link#01 解释这种行为。
Is there any way for B to know that old A's container is moved and it shouldn't access it?
无法检查旧容器是否移动,即检查它是否处于状态。但是可以访问它,例如调用 std::vector::empty
方法,因为该对象是有效的。有关解释,请参阅 this link。