someFunctionTakingCStrings(path.string().c_str()); безопасен, поскольку стандарт гарантирует, что время жизни анонимного временного path.string() сохраняется после вызова функции. Таким образом, указатель, возвращаемый c_str(), является допустимым параметром для someFunctionTakingCStrings.
const std::string path::string() const является безопасным, поскольку концептуально вы возвращаете копию значения tmp, хотя на практике компилятор оптимизирует копию значения (процесс, называемый оптимизацией именованного возвращаемого значения).
Что-то вроде const std::string& path::string() const с тем же телом функции, что и у вас, не будет определено (поскольку ссылка будет болтаться), и
const char* ub_server()
{
std::string s = "Hello";
return s.c_str();
}
также не определено, так как s находится вне области видимости к моменту возврата из функции.
Наконец, обратите внимание, что использование указателя на анонимный временный объект в качестве параметра при вызове функции не разрешено в стандартном C ++, хотя, к сожалению, Visual C ++ допускает это как расширение.
person
Bathsheba
schedule
20.12.2016