为什么`std :: stringstream :: stringstream(std :: string &&)`不存在?

Mus*_*ful 48 c++ stringstream rvalue-reference move-semantics c++17

我希望stringstream有一个构造函数窃取其初始内容string&&.STL中通常不存在这样的种间"移动构造函数"吗?如果没有,为什么不呢?

How*_*ant 55

有历史,这是令人失望的.但也是一个看起来光明的未来.

当移动语义进入C++ 11时,它是巨大的,有争议的,并且势不可挡.我希望能够将字符串移入移出stringstream.然而在当时的政治要求,内部店里没有必须是一个basic_string<charT>.例如,内部商店可能是vector.而且没有能力用分配器来控制事物.无论如何,需要在C++ 11时间框架中得到认可,但它只是一个过分的桥梁.

幸运的是,Peter Sommerlad已经收拾了P0408.这个提议增加了你所寻求的功能,希望对C++ 20来说,但这还不确定.它已经成功通过了LEWG,现在就在LWG的办公桌上.他们本月在拉珀斯维尔没有这么做,纯粹是因为时间表过载.我希望它将通过LWG,以及全体委员会投票.它肯定会得到我的投票.


Jos*_* D. 12

为什么不std::stringstream::stringstream(std::string&&)存在?

这是由于std::stringstream内部缓冲区造成的rdbuf.

rdbuf,(类型std::string_buf),不支持非复制访问,根据提案中的动机,p0408r4:

... 没有 对内部缓冲区的非复制访问, basic_stringbuf这使得至少从ostringstream 低效率获得输出结果,因为总是进行复制

但是,已经有计划支持std::string在stringsteam的构造函数中移动:

explicit basic_ostringstream(
   basic_string<charT, traits, Allocator>&& str,
   ios_base::openmode which = ios_base::out,
   const Allocator& a = Allocator());
Run Code Online (Sandbox Code Playgroud)

并移动 str()

template<class SAlloc = Allocator>
void str(basic_string<charT, traits, SAlloc>&& s);
Run Code Online (Sandbox Code Playgroud)

  • 它[现在修订版4](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0408r4.pdf). (3认同)