stringstream
がstring&&
から初期コンテンツを盗むコンストラクタを持っていることを望んでいました。そのような種間「コンストラクターの移動」は、一般にSTLに存在しませんか?そうでない場合は、なぜですか?
残念なことに歴史があります。しかし、明るい未来もあります。
移動セマンティクスがC++ 11に移行したとき、それは巨大で議論の余地があり、圧倒的でした。文字列をstringstream
からandに移動できるようにしたかった。しかし、当時の政治は、内部ストアがbasic_string<charT>
であるhaveを持たないことを要求していました。たとえば、内部ストアはvector
になります。そして、アロケーターで物事を制御する能力はありませんでした。いずれにせよ、その必要性はC++ 11の時間枠で認識されていましたが、それはただのかけ橋でした。
幸いなことに、Peter Sommerladは P0408 でスラックを拾いました。この提案は、C++ 20向けの機能を追加することを望んでいますが、まだ確実ではありません。 LEWGを正常に通過し、現在LWGの机の上にあります。純粋にスケジュールが過負荷だったため、彼らは今月Rapperswilでそれに到達しませんでした。私はそれがLWGを通過し、委員会の全投票を通過することを期待しています。確かに私の投票があります。
std::stringstream::stringstream(std::string&&)
が存在しないのはなぜですか?
これは、 std::stringstream
の内部バッファー rdbuf
が原因です。
rdbuf
、(type std::string_buf
)、提案の動機に従って、non-copyアクセスをサポートしていません p0408r4 :
... nonon-copyingが
basic_stringbuf
の内部バッファーにアクセスし、少なくともostringstream
からの出力結果の取得を行います非効率的、コピーは常に行われる
ただし、stringsteamのコンストラクタでstd::string
moveをサポートする計画は既にあります。
explicit basic_ostringstream( basic_string<charT, traits, Allocator>&& str, ios_base::openmode which = ios_base::out, const Allocator& a = Allocator());
そしてstr()
を移動します
template<class SAlloc = Allocator> void str(basic_string<charT, traits, SAlloc>&& s);