有没有一种方法可以将 std::string 移动(std::move)到 std::stringstream 中?

21

在c++参考中,我没有看到接受std::string右值引用的std::stringstream构造函数。是否有其他辅助函数可以将字符串移动到stringstream而不带开销,或者有特定的原因限制这样做?

在C++参考文档中,没有看到接受std::string右值引用参数的std::stringstream构造函数。是否有其他的辅助函数可以将字符串以最小开销的方式移动到stringstream中?或者是否由于某种特定原因,限制了这样的操作?

6
可能是因为std::stringstream不会在内部以字符串的形式存储数据,而是存储在一个流缓冲区中。因此,它需要将数据从字符串复制到字符串缓冲区中。如果使用移动语义,它就需要接管字符串缓冲区,因此需要知道它是如何被分配的(可能不是动态分配,参见短字符串优化),并且知道如何将字符串设置为有效状态。因此,允许使用移动语义意味着紧密耦合了string和stringstream类。 - Martin York
9
是的,“允许移动语义”意味着紧密耦合字符串和字符串流类。上帝保佑,同一库中的两个类被耦合在一起...... - Nicol Bolas
@NicolBolas:耦合通常意味着存在权衡。也许标准设计者不想承担这些权衡。std::string 对于大多数 C++ 应用程序非常关键。你想限制它的优化,只是为了使这个角落案例更有效吗?顺便说一句,我没有打算为 IO 库辩护,你可以向委员会提出异议(他们比我聪明)。只是试图为这种限制提供一个合理的解释。 - Martin York
@LokiAstari:你的方法限制了优化,而这些情况实际上可能并不存在。这不是一个非此即彼的问题。当前的行为使得允许实现移动字符串数据变得不可能str()是一个const函数;它根本不允许修改stringstream的数据。很容易创建API,允许移动字符串数据而不需要这样做。在移动到流中之后,字符串将是“有效但未指定的”。从流中移动后,流将是“有效但未指定的”。 - Nicol Bolas
@NicolBolas:这怎么是我的错?看起来你对委员会有一个好建议。你应该把它写下来并提出来。 - Martin York
显示剩余3条评论
2个回答

10

自C++20起,您可以将一个string移动到stringstream中:cppreference


对于C++20之前的版本:

我没有看到std::stringstream构造函数接受std::string的右值引用

是的。即使str设置器也不使用移动语义,因此不能将字符串移动到stringstream中(不支持在当前标准中,但希望在下一个标准中支持)。


1
希望有一些好人提出建议,使C++更加简单明了 :) - W.F.

10

在C++20中,您将能够将一个字符串移动到一个字符串流中。

移动语义由构造函数支持:

std::string myString{ "..." };
std::stringstream myStream{ std::move(myString) };

也可以在构造后通过调用str()来完成:

std::string myString{ "..." };
std::stringstream myStream;
myStream.str(std::move(myString));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接