std::string a = "xxx"; std::string b = std::move(a); //这时候的a,处于什么状态呢 a = "bbbbb";//合法吗?
因为我实际用下来好像有点问题。所以我就想知道,在标准中,是怎么描述这个问题的。
人生最曼妙的风景,竟是内心的淡定与从容!
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」の値がコピーされます。これは、新しく割り当てられたバッファを指すことを意味するため、問題はありません。
basic_string(basic_string&& str, const Allocator& alloc);
a = "bbbbb"
basic_string<charT,traits,Allocator>&operator=(const charT* s);
*this = Basic_string<charT,traits,Allocator> を返します;(s)
結局のところ、string は文字列です。gcc の組み込みの string を参照してください。 を使用した実装 operator = (&&) swap によって実装された標準は、move が不確実な状態にあることを意味します stl code> は、move も empty 状態になるようにするためのものですが、string は stl
string
gcc
を使用した実装 operator = (&&) swap
operator = (&&)
move
stl code> は、move も empty 状態になるようにするためのものですが、string は stl
empty
stl
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」の値がコピーされます。これは、新しく割り当てられたバッファを指すことを意味するため、問題はありません。
結局のところ、
string
は文字列です。gcc
の組み込みのstring
を参照してください。を使用した実装
によって実装された標準は、operator = (&&)
swap
move
が不確実な状態にあることを意味しますstl code> は、
move
もempty
状態になるようにするためのものですが、string
はstl