为什么 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 和全体委员会投票。它肯定会得到我的投票。
我希望 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 anostringstream
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 和全体委员会投票。它肯定会得到我的投票。