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