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

时间:2018-06-25 00:19:41

标签: c++ c++17 move-semantics stringstream rvalue-reference

我希望stringstream的构造函数可以从string&&窃取其初始内容。这样的物种间“移动构造函数”在STL中通常不存在吗?如果没有,为什么不呢?

2 个答案:

答案 0 :(得分:54)

这里的历史令人失望。但未来也很光明。

当移动语义学进入C ++ 11时,它是巨大的,有争议的并且是压倒性的。我希望能够将字符串从stringstream移到。但是,当时的政治要求内部存储必须basic_string<charT>。例如,内部存储可以是vector。而且没有能力用分配器控制事物。无论如何,在C ++ 11的时间框架内已经意识到了这种需求,但这只是一座桥梁。

幸运的是,彼得·索默拉德(Peter Sommerlad)用P0408弥补了这一懈怠。该提议增加了您寻求的功能,希望能用于C ++ 20,但这还不确定。它已成功通过LEWG,并且现在位于LWG的桌面上。他们本月未在拉珀斯维尔(Rapperswil)到达目的地,纯粹是因为日程安排过多。我希望它将通过LWG和委员会全体表决。当然,我会投票。

答案 1 :(得分:12)

  

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

这归因于std::stringstream的内部缓冲区rdbuf

根据提案std::string_buf的动机,

rdbuf(类型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());

并移动str()

template<class SAlloc = Allocator>
void str(basic_string<charT, traits, SAlloc>&& s);