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

Why doesn't `std::stringstream::stringstream(std::string&&)` exist?

我希望 stringstream 有一个从 string&& 窃取其初始内容的构造函数。这种跨物种"move constructors"的STL一般不存在吗?如果不是,为什么不呢?

Why doesn't std::stringstream::stringstream(std::string&&) exist?

这是由于 std::stringstream's internal buffer, rdbuf

rdbuf,(输入std::string_buf), doesn't support non-copy access as per the motivation in proposal, p0408r4:

... there is no non-copying access to the internal buffer of a basic_stringbuf which makes at least the obtaining of the output results from an ostringstream inefficient, because a copy is always made

但是,在 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);

有历史,令人失望。也是一片光明的未来。

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

幸运的是,Peter Sommerlad 用 P0408 填补了空缺。该提案添加了您寻求的功能,希望是针对 C++20,但这还不确定。它已成功通过 LEWG,现在就在 LWG 的办公桌上。他们本月没有参加拉珀斯维尔的比赛,纯粹是因为日程安排太满了。我希望它能通过 LWG 和全体委员会投票。它肯定会得到我的投票。