web-dev-qa-db-ja.com

なぜ `std :: stringstream :: stringstream(std :: string &&)`が存在しないのですか?

stringstreamstring&&から初期コンテンツを盗むコンストラクタを持っていることを望んでいました。そのような種間「コンストラクターの移動」は、一般にSTLに存在しませんか?そうでない場合は、なぜですか?

48
Museful

残念なことに歴史があります。しかし、明るい未来もあります。

移動セマンティクスがC++ 11に移行したとき、それは巨大で議論の余地があり、圧倒的でした。文字列をstringstreamからandに移動できるようにしたかった。しかし、当時の政治は、内部ストアがbasic_string<charT>であるhaveを持たないことを要求していました。たとえば、内部ストアはvectorになります。そして、アロケーターで物事を制御する能力はありませんでした。いずれにせよ、その必要性はC++ 11の時間枠で認識されていましたが、それはただのかけ橋でした。

幸いなことに、Peter Sommerladは P0408 でスラックを拾いました。この提案は、C++ 20向けの機能を追加することを望んでいますが、まだ確実ではありません。 LEWGを正常に通過し、現在LWGの机の上にあります。純粋にスケジュールが過負荷だったため、彼らは今月Rapperswilでそれに到達しませんでした。私はそれがLWGを通過し、委員会の全投票を通過することを期待しています。確かに私の投票があります。

55
Howard Hinnant

std::stringstream::stringstream(std::string&&)が存在しないのはなぜですか?

これは、 std::stringstream の内部バッファー rdbuf が原因です。

rdbuf、(type std::string_buf )、提案の動機に従って、non-copyアクセスをサポートしていません p0408r4

... nonon-copyingbasic_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);
12
Joseph D.