std::string a = "xxx";
std::string b = std::move(a);
//这时候的a,处于什么状态呢
a = "bbbbb";//合法吗?
因为我实际用下来好像有点问题。所以我就想知道,在标准中,是怎么描述这个问题的。
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」の値がコピーされます。これは、新しく割り当てられたバッファを指すことを意味するため、問題はありません。
黄舟2017-04-17 14:53:13
結局のところ、string
は文字列です。gcc
の組み込みの string
を参照してください。 を使用した実装
によって実装された標準は、operator = (&&)
swapmove
が不確実な状態にあることを意味します stl code> は、
move
も empty
状態になるようにするためのものですが、string
は stl< に属していません。 /コード>