有没有办法将std::string移动到std::stringstream中 > C++引用中,我没有看到 STD::String Strue构造函数接受代码> STD::String < /代码>的rValk引用。是否有任何其他辅助函数可以在不增加开销的情况下将字符串移动到stringstream,或者在进行此类限制的背后是否有特定的原因

有没有办法将std::string移动到std::stringstream中 > C++引用中,我没有看到 STD::String Strue构造函数接受代码> STD::String < /代码>的rValk引用。是否有任何其他辅助函数可以在不增加开销的情况下将字符串移动到stringstream,或者在进行此类限制的背后是否有特定的原因,c++,c++11,c++14,move-semantics,C++,C++11,C++14,Move Semantics,我没有看到std::stringstream构造函数接受std::string 对。即使setter也不使用移动语义,因此不支持将字符串移动到stringstream(当前标准中不支持,但希望在下一个标准中支持)。您可以在C++20中将字符串移动到字符串流中 移动语义由以下组件支持: 也可以在施工后通过调用: 可能是因为std::stringstream在内部不将数据存储为字符串,而是存储在流缓冲区中。因此,它需要将数据从字符串复制到字符串缓冲区。如果它使用移动语义,它将需要获得字符串缓冲区的所

我没有看到
std::stringstream
构造函数接受
std::string


对。即使setter也不使用移动语义,因此不支持将字符串移动到
stringstream
(当前标准中不支持,但希望在下一个标准中支持)。

您可以在C++20中将字符串移动到字符串流中

移动语义由以下组件支持:

也可以在施工后通过调用:


可能是因为std::stringstream在内部不将数据存储为字符串,而是存储在流缓冲区中。因此,它需要将数据从字符串复制到字符串缓冲区。如果它使用移动语义,它将需要获得字符串缓冲区的所有权,因此需要知道它是如何分配的(这可能不是动态分配的,请参阅short sting optimization),并知道如何将字符串设置为有效状态。因此,允许移动语义意味着紧密耦合字符串和stringstream类。@LokiAstari:“允许移动语义意味着紧密耦合字符串和stringstream类。”是的,上帝禁止将同一库中的两个类耦合在一起…@Nicolas:coupling通常意味着要进行权衡。也许标准设计师不想付出这些代价。STD::对于大多数C++应用程序来说,字符串是非常重要的。你想限制对它的优化,只是为了让这种情况更有效吗?PS我无意为IO库辩护,你可以向委员会(他们比我聪明)提出这个问题。只是试图为限制提供一个合理的解释。@LokiAstari:你的方式限制了那些你甚至不能说确实存在的情况下的优化。这不是非此即彼的事情。当前行为使实现无法移动字符串数据
str()
是一个
const
函数;根本不允许修改
stringstream
的数据。创建允许在不需要移动字符串数据的情况下移动字符串数据的API将非常容易。移动到流中后,字符串将是“有效但未指定的”。离开流后,流将“有效但未指定”。@Nicolas:这怎么是我的错?看来你给委员会提了个好建议。你应该写出来并提出建议。希望有一些好的人能创造出让C++更直接的建议:
std::string myString{ "..." };
std::stringstream myStream{ std::move(myString) };
std::string myString{ "..." };
std::stringstream myStream;
myStream.str(std::move(myString));