std::string::c_str() and temporaries

前端 未结 3 1716
独厮守ぢ
独厮守ぢ 2020-11-28 07:22

Is the following C++ code well-formed:

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

std::string random_string_generator()
{
  // returns a ran         


        
3条回答
  •  温柔的废话
    2020-11-28 08:06

    The pointer returned by std::string::c_str() points to memory maintained by the string object. It remains valid until a non-const function is called on the string object, or the string object is destructed. The string object you're concerned about is a temporary. It will be destructed at the end of the full expression, not before and not after. In your case, the end of the full expression is after the call to consumer, so your code is safe. It wouldn't be if consumer saved the pointer somewhere, with the idea of using it later.

    The lifetime of temporaries has been strictly defined since C++98. Before that, it varied, depending on the compiler, and the code you've written wouldn't have worked with g++ (pre 1995, roughly—g++ changed this almost immediately when the standards committee voted it). (There wasn't an std::string then either, but the same issues affect any user written string class.)

提交回复
热议问题