如果在定义 std::move 之后使用 QString?

If using QString after being `std::move`d defined?

考虑以下模式,为简单起见去掉了细节:

 QString str  = /* expression */
 /* some actions with str */
 foo(std::move(str));

 str =  /* expression */
 /* some actions with str */
 foo(std::move(str));

重用 str 是否会在 Qt 4.8.6 中产生定义的行为? Qt 5.x?

移动操作使 moved-from 对象处于“有效但未指定的状态”:

16.5.5.16 Moved-from state of library types [lib.types.movedfrom]

Objects of types defined in the C ++ standard library may be moved from. Move operations may be explicitly specified or implicitly generated. Unless otherwise specified, such moved-from objects shall be placed in a valid but unspecified state.

如前所述,此声明来自 C++ 标准,指的是来自 C++ 库的 类。然而,可以很容易地打赌 Qt 库会在这里寻求遵守相同的标准,这也适用于 Qt 库。这是一个非常安全的赌注(它也恰好是真的)。​​

“有效但未指定”状态意味着 moved-from 对象仍然是有效的 well-formed 对象。因为它是未指定的,所以您无法保证,如果您调用它的 size() 方法,您将获得任何特定值。它可能是 0(可能),也可能是其他东西。然而,由于它是一个有效的对象,无论您从 moved-from QStringsize() 中得到什么,如果您随后继续检查字符串中的内容,您将看到相同的确切数字里面的人物。

而且,由于它是一个有效的 QString 对象,您可以通过向其分配内容来完全替换其内容,使该对象处于 fully-specified 有效状态。