C++ stringstream是如何工作的?

C++ stringstream是如何工作的?,c++,stringstream,C++,Stringstream,我正在程序中使用stringstreamtype变量。 以下是代码片段: stringstream keyvalueStream; keyvalueStream << // appending some string somefun(keyvalueStream.str().c_str()); // Passing the char* keyvalueStream.str(std::string()); // clearing the content of this variab

我正在程序中使用
stringstream
type变量。 以下是代码片段:

stringstream keyvalueStream;
keyvalueStream << // appending some string 

somefun(keyvalueStream.str().c_str()); // Passing the char*
keyvalueStream.str(std::string()); // clearing the content of this variable.
stringstream-keyvalueStream;

当到达keyvalueStream.str(std::string())时,keyvalueStream;在你的代码片段中有一些有趣的东西(keyvalueStream.str().c_str());已经完成了执行,所以没有。如果这是你的问题。

没有,它不会影响你已经传递给somefun()的内容。stringstream::str()按值返回,因此您可以获得流中数据的副本,而不是对它的引用。

是。会的

然而,一旦你得到了底层的
str
,你甚至不应该调用
c\u str()。它一直可用到表达式末尾

注释

str返回的基础字符串的副本是一个临时对象,将在表达式末尾被销毁,因此直接对str()的结果调用c_str()(例如在auto*ptr=out.str().c_str();)会导致指针悬空


您的问题的答案取决于
somefun
对传递给它的
char const*
做了什么,而不取决于是否清除
stringstream
的内容

按值返回
std::string
对象,因此以后是否清除
stringstream
内容无关紧要

在表达式中

somefun(keyvalueStream.str().c_str());

当对
somefun
的调用返回时,返回的
string
对象将被销毁。因此,如果
somefun
以某种方式存储
char const*
以供以后使用,那么您将有未定义的行为。如果它在当前函数调用中按需要对参数进行操作,那么您的代码是安全的。

@juanchopanza:对象只有在
somefun
返回(完整表达式的结尾)后才会死亡,那么在我的情况下我该怎么办?有什么建议吗?上面的ans表示它不会影响?问题中没有足够的信息来说明OP是否应该对返回的字符串调用
c_str
。-1,“表达式结尾”在
somefun
返回之后,这已经足够晚了。您引用的
cppreference
中的示例不适用于此问题。