【发布时间】:2018-08-06 12:46:28
【问题描述】:
A a5(move(a1));
虽然移动后 a1 的成员变量设置为默认值,但 a1 本身并未设置为 null。您不能执行 a1 == nullptr... 来检查 a1 是否无用...
我觉得这很奇怪。我在这里有什么误解吗?我认为如果 a1 被移动,它将变得无用,这应该通过以某种方式将其设置为 null 来表示。没有?
问题是,通过将 a1 保留为非 null 状态,它仍然可以使用。没有编译器警告或错误。没有真正的迹象表明该对象处于混乱状态。如果 a 有两个成员 var,一个 int 和一个动态 alloc 对象,则 dyn alloc 对象将指向 nullptr 但 int 将有一个 def 值(当然只有在正确实施的情况下......容易搞砸)。
所以搬家后就可以了
int number = a1.getInt();
并取回一个没有意识到 a1 已被重置的数字。在 C 和 C++ 中,我们被教导在其资源被盗时将指针设置为 null(a.k.a nullptr 或 NULL)以消除这种混淆。随着引入移动窃取对象资源的功能,是否没有内置机制或最佳实践来指示对象已被窃取并因此“重置”为默认构造状态?
编辑 添加了示例移动 c'tor
A(A&& other) : num(other.num), s(other.s){
other.num = 0;
other.s = nullptr; //dyn alloc obj
}
【问题讨论】:
-
C++ 没有像其他语言一样将对象设置为“null”的通用方法。通常
moveing 一个对象要么复制它,要么让它处于“空”状态,但这完全取决于实现 -
“Null”在 C++ 中不是一个通用的东西。
-
移动操作的要求是使对象处于可以安全销毁的有效但未指定的状态。不要求它使对象处于“空”或“空”状态。
-
那么有没有办法知道或检查一个对象是否被盗?
标签: c++ c++11 move-semantics