构造一个临时对象并调用一个返回指针的方法 - 这样安全吗?

时间:2011-04-25 14:07:58

标签: c++

我的直觉说它不是,但事实是一切都在同一条线上进行,这有点令人困惑。我想知道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;
}

3 个答案:

答案 0 :(得分:2)

c_str()返回的值只要从中获取的std :: string未更改且尚未销毁就有效。因此,您的代码完全没问题,因为您创建的临时代码将具有与完整表达式(在本例中为cout链)相当的生命周期。

答案 1 :(得分:2)

是的,这是安全的。临时A()在语句的末尾被销毁。那是在cout使用返回的指针之后。

答案 2 :(得分:0)

如果内容在通话之间没有变化,则是安全的。

返回的地址确实指向char *的有效位置。