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