我的直觉说它不是,但事实是一切都在同一条线上进行,这有点令人困惑。我想知道cout
使用它时指针是否仍然有效。
#include <iostream>
#include <string>
struct A {
A() : m_s("test"){ }
const char* c_str() { return m_s.c_str(); }
std::string m_s;
};
int main() {
std::cout << "abc " << A().c_str() << " def" << std::endl;
}
答案 0 :(得分:2)
c_str()返回的值只要从中获取的std :: string未更改且尚未销毁就有效。因此,您的代码完全没问题,因为您创建的临时代码将具有与完整表达式(在本例中为cout链)相当的生命周期。
答案 1 :(得分:2)
是的,这是安全的。临时A()
在语句的末尾被销毁。那是在cout使用返回的指针之后。
答案 2 :(得分:0)
如果内容在通话之间没有变化,则是安全的。
返回的地址确实指向char *的有效位置。