std :: string :: c_str()和temporaries

use*_*108 56 c++ stl stdstring

以下C++代码是否格式良好:

void consumer(char const* p)
{
  std::printf("%s", p);
}

std::string random_string_generator()
{
  // returns a random std::string object
}

consumer(random_string_generator().c_str());
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,在创建临时std :: string对象并获取c_str()指针后,没有什么能阻止std :: string对象被破坏(或者我错了?).如果代码一切正常,你能指点我的标准吗?当我使用g ++进行测试时,它确实有效.

Jam*_*nze 69

指针返回的指针由std::string::c_str()字符串对象维护.它在字符串对象上调用非const函数或者破坏字符串对象之前一直有效.您关注的字符串对象是临时的.它将在完整表达结束时被破坏,而不是在之前和之后.在您的情况下,完整表达式的结尾是在调用之后consumer,因此您的代码是安全的.如果consumer 将指针保存在某个地方,并且稍后使用它的想法就不会这样.

自C++ 98以来,临时工作的生命周期已经严格定义.在此之前,它取决于编译器而变化,并且您编写的代码不适用于g ++(1995年之前,大约-g ++几乎在标准委员会投票时立即改变了这一点).(当时也没有std::string,但同样的问题会影响任何用户编写的字符串类.)


Jon*_*Jon 20

临时std::string的生命周期延伸到consumer返回点之外,因此可以直接从内部consumer使用该字符串上的任何内容.什么是不好的是存储c_str返回的值并稍后尝试使用它(临时将被销毁,我们只能猜测你将在指针的另一端找到什么).

  • 临时的生命周期在§12.2中定义.(第12节的标题是"特别成员职能",这不是你期望寻找终身临时工作的地方,但这就是它的所在.) (3认同)

dgu*_*abs 5

函数random_string_generator()返回的临时值可以安全地用于consumer()函数.