我的问题可以简化为,stringstream.str().c_str()
返回的字符串存储在内存中的哪个位置,为什么不能将其分配给 const char*
?
以下代码示例会更好地说明这一点。
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream ss("this is a string\n");
string str(ss.str());
const char* cstr1 = str.c_str();
const char* cstr2 = ss.str().c_str();
cout << cstr1 // Prints correctly
<< cstr2; // ERROR, prints out garbage
system("PAUSE");
return 0;
}
假设stringstream.str().c_str()
可以赋值给const char*
的假设导致了一个bug,花费了我很长时间去追踪。
额外加分的话,有人可以解释一下为什么用以下语句替换cout
语句会得到正确的输出吗?
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
能正确打印字符串吗?
我正在使用Visual Studio 2008编译。
str()
被实现成 RVO 可以触发的方式(这很可能),编译器将允许直接将结果构造到tmp
中,省略临时变量;当启用优化时,任何现代 C++ 编译器都会这么做。当然,将绑定到常量引用的解决方案保证不会有复制,因此可能更可取 - 但我认为还是值得澄清的。 - Pavel Minaev