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就指向新分配的缓冲区了,理应是没问题的。
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就指向新分配的缓冲区了,理应是没问题的。
我觉得不会有什么问题,
string
毕竟是个字符串,看gcc
自带的string
实现是用swap
实现的operator = (&&)
标准的意思是
move
之后是处于不确定的状态的stl
是保证move
之后也应该处于一种空
的状态,不过string
并不属于stl