首頁  >  問答  >  主體

c++11 - c++标准有关于处在moved状态的容器的说明吗?

std::string a = "xxx";
std::string b = std::move(a);
//这时候的a,处于什么状态呢
a = "bbbbb";//合法吗?

因为我实际用下来好像有点问题。所以我就想知道,在标准中,是怎么描述这个问题的。

黄舟黄舟2764 天前538

全部回覆(2)我來回復

  • PHPz

    PHPz2017-04-17 14:53:13

    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就指向新分配的緩衝區了,理應是沒問題的。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 14:53:13

    我覺得不會有什麼問題,string畢竟是個字串,看gcc自帶的string實現是用swap實現的operator = (&&)
    標準的意思是move之後是處於不確定的狀態的
    stl是保證move之後也應該處於一種的狀態,不過string並不屬於stl

    回覆
    0
  • 取消回覆