Итак, ваш второй экзамен - Неопределенное поведение из-за доступа к освобожденной памяти. Все может случиться.
func()
возвращает временное std::string
, время жизни которого заканчивается в конце полного выражения, превращая c
в висячий указатель:
const char* c = func().c_str();
Противопоказано использование висящего указателя, особенно разыменования:
std::cout << c << std::endl;
Первый пример позволяет избежать этого, сохраняя возвращаемое значение в переменной и печатая его.
В-третьих, также сохраняя возвращаемое значение в переменной, даже если тогда он по какой-то непостижимой причине использует указатель на принадлежащую последовательность для вывода.