问题描述
std::string a = 'xxx';std::string b = std::move(a);//这时候的a,处于什么状态呢a = 'bbbbb';//合法吗?
因为我实际用下来好像有点问题。所以我就想知道,在标准中,是怎么描述这个问题的。
问题解答
回答1:C++11 21.4.3.17:basic_string(basic_string&& str, const Allocator& alloc);str is left in a valid state with an unspecified value.因为a其实是左值,被转化为右值了,所以b会指向a的data()缓冲区。这个时候a就处于未定义状态,再访问a的值就不安全了。不过a = 'bbbbb'是合法的。因为这个a重载了赋值运算符。basic_string<charT,traits,Allocator>& operator=(const charT* s);会返回一个*this = basic_string<charT,traits,Allocator>(s)相当于又构造了一个新的临时对象basic_string右值。它会拷贝'bbbbb'的值,这是a就指向新分配的缓冲区了,理应是没问题的。
回答2:我觉得不会有什么问题,string毕竟是个字符串,看gcc自带的string实现是用swap实现的operator = (&&)标准的意思是move之后是处于不确定的状态的stl是保证move之后也应该处于一种空的状态,不过string并不属于stl