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



我希望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);

最新更新