Пусть есть две функции
std::string f();
void g(const char*);
которые я не могу изменить. Отличаются ли чем-либо следующие способы их использования:
{ g(f().c_str()); } // 1
{ g(f().data()); } // 2
{ std::string tmp = f(); g(tmp.c_str()); } // 3
{ std::string tmp = f(); g(tmp.data()); } // 4
Был бы признателен за подробное объяснение работы внутренней кухни в сл-ях 1 и 2. Создается временная переменная типа std::string, берется указатель на ее данные, передается в g(). Когда уничтожается эта временная переменная?
Способы отличаются лишь написанием, поведением они не отличаются. Временные переменные, всегда уничтожаются по завершении выполнения полного выражения. Релевантные параграфы в C++14: [intro.execution]p10 и [class.temporary]p3
В последних двух случаях по окончании работы g() у вас останется переменная tmp, с которой можно продолжать работать. В первых двух случаях доступа к строке, возвращенной f(), не будет, она будет уничтожена по окончании работы g() автоматически.
В любом случае во время работы функции ее аргументы остаются в области видимости, так что до завершения работы функции уничтожение аргумента не произойдет.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости