c++ 将新值赋给已移出的对象并进一步使用此对象是否安全?

e37o9pze  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(129)
std::string str1{"This is a test string"};
std::string str2{std::move(str1)};
str1 = "This is a new content of this string";
// Use str1...

我认为str1现在处于有效状态,并且在为其分配新值后可以完全安全地使用,这对吗?

bnlyeluc

bnlyeluc1#

我认为str1现在处于有效状态,并且在为其分配新值后可以完全安全地使用,这对吗?
你说得对。
将新值赋给已移出的对象并进一步使用此对象是否安全?
它们取决于移动操作符/构造函数和赋值操作符的定义,可能是安全的(通常也是),但也可能是不安全的(至少在理论上是这样)。
对于包括std::string在内的所有标准库类型(首先是可移动和可赋值的),移动操作会使被移动的对象处于 * valid * 但未指定的状态,而赋值操作符在被赋值的对象上没有先决条件,因此总是允许的。
为任何类提供类似的保证是一个很好的约定,但也有可能不这样做,在这种情况下,进行这样的赋值可能是不安全的。

yyhrrdl8

yyhrrdl82#

我认为str1现在处于有效状态,并且在为其分配新值后可以完全安全地使用,这对吗?
是的,您可以安全地赋值给str1(就像您已经做的那样),然后将str1用于其他目的。

相关问题