如果在定义 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 QString
的 size()
中得到什么,如果您随后继续检查字符串中的内容,您将看到相同的确切数字里面的人物。
而且,由于它是一个有效的 QString
对象,您可以通过向其分配内容来完全替换其内容,使该对象处于 fully-specified 有效状态。
考虑以下模式,为简单起见去掉了细节:
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 QString
的 size()
中得到什么,如果您随后继续检查字符串中的内容,您将看到相同的确切数字里面的人物。
而且,由于它是一个有效的 QString
对象,您可以通过向其分配内容来完全替换其内容,使该对象处于 fully-specified 有效状态。