【问题标题】:Is there a way to std::move std::string into std::stringstream有没有办法将 std::move std::string 到 std::stringstream
【发布时间】:2016-09-10 19:28:45
【问题描述】:

在 c++ 参考中,我没有看到 std::stringstream 构造函数接受 std::string 的右值引用。是否有任何其他辅助函数可以在没有开销的情况下将字符串移动到字符串流,或者是否有特殊原因造成这种限制?

【问题讨论】:

  • 可能是因为 std::stringstrream 不在内部将数据存储为字符串,而是在流缓冲区中存储。所以它需要将字符串中的数据复制到字符串缓冲区中。如果它使用移动语义,则需要获取字符串缓冲区的所有权,因此需要知道它是如何分配的(可能不是动态分配的,请参见短刺优化)并知道如何将字符串设置为有效状态。所以允许移动语义意味着紧密耦合字符串和字符串流类。
  • @LokiAstari:“所以允许移动语义意味着紧密耦合字符串和字符串流类。”是的,上帝禁止来自同一个库的两个类耦合在一起......
  • @NicolBolas:耦合通常意味着有权衡。也许标准设计者不想付出这些权衡。 std::string 对于大多数 C++ 应用程序来说非常重要。您是否想限制对其进行优化以使这种极端情况更有效? PS 我无意为 IO 库辩护,您可以与委员会(他们比我聪明)一起讨论。只是试图为限制提供一个合理的解释。
  • @LokiAstari:你的方式限制了你甚至不能说实际存在的情况的优化。这不是一个非此即彼的事情。当前的行为使得不可能允许实现移动字符串数据。 str() 是一个 const 函数;根本不允许修改stringstream 的数据。创建允许移动字符串数据而不需要它的 API 将非常容易。进入流后,字符串将是“有效但未指定”。从流中移动后,流将是“有效但未指定”。
  • @NicolBolas:这是我的错吗?看来你对委员会有一个很好的建议。你应该把它写下来并提出建议。

标签: c++ c++11 c++14 move-semantics


【解决方案1】:

从 C++20 开始,您可以将 string 移动到 stringstreamcppreference


C++20 之前的旧答案:

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

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

【讨论】:

  • 希望有一些优秀的人提出让 c++ 更直接的建议 :)
【解决方案2】:

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

constructor 支持移动语义:

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

也可以在构造后调用str():

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

【讨论】:

    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2018-10-18
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多