検索

ホームページ  >  に質問  >  本文

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

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

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

黄舟黄舟2807日前564

全員に返信(2)返信します

  • PHPz

    PHPz2017-04-17 14:53:13

    C++11 21.4.3.17:
    basic_string(basic_string&& str, const Allocator& alloc);
    str は値が指定されていない有効な状態のままです。
    理由は、 a は実際には左辺値であり、右辺値に変換されているため、b は a の data() バッファを指します。現時点では、a は未定義の状態にあり、a の値に再度アクセスすることは安全ではありません。
    ただし、a = "bbbbb" は合法です。
    これは代入演算子をオーバーロードするためです。
    basic_string<charT,traits,Allocator>&operator=(const charT* s);

    *this = Basic_string<charT,traits,Allocator> を返します;(s)
    これは、新しい一時オブジェクトの Basic_string rvalue を構築することと同じです。 「bbbbb」の値がコピーされます。これは、新しく割り当てられたバッファを指すことを意味するため、問題はありません。

    返事
    0
  • 黄舟

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

    結局のところ、string は文字列です。gcc の組み込みの string を参照してください。 を使用した実装 operator = (&&)
    swap
    によって実装された標準は、move が不確実な状態にあることを意味します
    stl は、moveempty 状態になるようにするためのものですが、stringstl< に属していません。 /コード>

    返事
    0
  • キャンセル返事