我希望stringstream
有一个构造函数可以从string&&
窃取其初始内容。这种种间"移动构造函数"在STL中通常不存在吗?如果没有,为什么不呢?
有历史,这令人失望。 但也是一个看起来光明的未来。
当移动语义进入C++11时,它是巨大的,有争议的,压倒性的。 我希望能够将字符串移入和移出stringstream
。 然而,当时的政治要求内部商店不必是basic_string<charT>
。 例如,内部存储可以是vector
。 而且没有能力用分配器控制事物。 无论如何,在C++11时间框架内认识到了这一需求,但这只是一座太远的桥梁。
幸运的是,彼得·索默拉德(Peter Sommerlad(用P0408弥补了这一空缺。 此提案增加了您寻求的功能,希望为 C++20,但这还不确定。 它已成功通过LEWG,现在在LWG的办公桌上。 他们本月在拉珀斯维尔没有到达,纯粹是因为超负荷的日程安排。 我希望它将通过LWG和全体委员会的投票。 它肯定会得到我的投票。
为什么
std::stringstream::stringstream(std::string&&)
不存在?
这是由于std::stringstream
的内部缓冲区,rdbuf
.
rdbuf
(类型std::string_buf
( 不支持根据提案 p0408r4 中的动机进行非复制访问:
。没有对内部缓冲区的非复制访问
basic_stringbuf
至少使输出获得 导致ostringstream
效率低下,因为副本始终 䍬
但是,已经有一个计划来支持 stringsteam 的构造函数std::string
移动:
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);