Пусть есть две функции
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 метода класса