Пусть есть две функции
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()
автоматически.
В любом случае во время работы функции ее аргументы остаются в области видимости, так что до завершения работы функции уничтожение аргумента не произойдет.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
У меня проблемы с использованием pthread_create если передавать в аргумент метод класса, потому что компилятор постоянно выдает ошибку:
Я новичек в С++, объясните пожалуйста, почему не отрабатывает дружественная функция в main? Имеется:
Консольное приложениеЕсть цикл, в нем по очереди вызываются 3 метода класса