我们有一个函数GetString()返回std::string。然后,我们有了一个使用C样式字符串的ConsumeString(char*)函数。
编写ConsumeString(GetString().c_str())是一个错误吗?在我看来,这似乎是一个错误,因为在运行c_str()之后,原始的匿名字符串将被破坏,并且您将拥有一个不再存在的指针。但是奇怪的是,它似乎总是可以正常工作。
我只是注意到,当我尝试将GetString().c_str()分配给变量然后在两个单独的ConsumeString()函数中使用它时,这可能是个问题,这时它打印了损坏的字符串,问题变得很明显。但是我不知道为什么在前一种情况下它会起作用。
它是否可能是恰好起作用的错误,还是C++专门允许这样做?

最佳答案

除非ConsumeString(直接或间接)对提供给它的const char*进行异步处理,否则此代码非常安全。GetString()返回的临时文件将一直存在,直到函数ConsumeString返回为止,因此,如果在返回之前完成所有与参数有关的工作,则一切将正常工作。
在您的其他情况下-我假设您有这样的事情:

 const char* s = GetString().c_str(); // 1
 ConsumeString(s); // 2
第1行结束后,由GetString返回的临时文件被销毁,因此ConsumeString使用了无效的指针。
有关临时对象的生存期的更正式的措辞,可以引用cppreference,特别是

07-28 13:22