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

Constructing a temp object and calling a method that returns a pointer - is it safe?

本文关键字:一个 方法 安全 临时对象 调用 返回 指针      更新时间:2023-10-16

我的直觉告诉我不是,但事实上,所有的事情都在同一行中进行,这有点令人困惑。我想知道当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;
}

是的,它是安全的。临时A()在语句的末尾被销毁。

c_str()返回的值是有效的,只要它所获得的std::字符串没有改变并且没有被销毁。因此,您的代码是完全没问题的,因为您创建的临时将具有与它所属的完整表达式(在本例中为cout链)等效的生命周期。

如果在调用之间内容不更改,则是安全的。

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