Время жизни временной переменной

253
26 ноября 2016, 18:54

Пусть есть две функции

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(). Когда уничтожается эта временная переменная?

Answer 1

Способы отличаются лишь написанием, поведением они не отличаются. Временные переменные, всегда уничтожаются по завершении выполнения полного выражения. Релевантные параграфы в C++14: [intro.execution]p10 и [class.temporary]p3

Answer 2

В последних двух случаях по окончании работы g() у вас останется переменная tmp, с которой можно продолжать работать. В первых двух случаях доступа к строке, возвращенной f(), не будет, она будет уничтожена по окончании работы g() автоматически.

В любом случае во время работы функции ее аргументы остаются в области видимости, так что до завершения работы функции уничтожение аргумента не произойдет.

READ ALSO
pthread_create() как правильно работает?

pthread_create() как правильно работает?

У меня проблемы с использованием pthread_create если передавать в аргумент метод класса, потому что компилятор постоянно выдает ошибку:

273
проблема с дружественной функцией

проблема с дружественной функцией

Я новичек в С++, объясните пожалуйста, почему не отрабатывает дружественная функция в main? Имеется:

343
Пауза в бесконечном цикле по кнопке

Пауза в бесконечном цикле по кнопке

Консольное приложениеЕсть цикл, в нем по очереди вызываются 3 метода класса

229
emplace_back для int

emplace_back для int

‒ Ты понимаешь, что происходит? ‒ Тебе объяснить? ‒ Объяснить я и сам могу

327