Когда именно разрушаются аргументы функции?

У меня вопрос, потому что мне непонятно, когда уничтожаются аргументы функции. Следовательно, является ли конкатенация следующей функции doSomething подверженной ошибкам или нет?

Я спрашиваю, потому что программист несет ответственность за то, чтобы std::string_view не переживал указанный массив символов. Можно ли это гарантировать в данном конкретном случае или нет?

#include <string>
#include <string_view>

std::string doSomething(const std::string_view& str_view)
{
    // do something and create a new std::string instance based on the std::string_view instance

    return str;
}

int main()
{
    std::string input_str{"Hello world!"};

    std::string output_str{ doSomething(doSomething(doSomething(input_str))) };

    return 0;
}

person D3V0N5H1R3    schedule 13.05.2021    source источник
comment
ну, вы возвращаете std::string, это все равно не зависит от std::string_view.   -  person apple apple    schedule 13.05.2021
comment
Массив символов, на который указывает указатель, в этом случае — это input_str.data(), который существует до тех пор, пока не вернется main, что определенно длиннее любого из последних аргументов str_view.   -  person Nathan Pierson    schedule 13.05.2021
comment
related/dupe: stackoverflow.com/questions/27195825/   -  person NathanOliver    schedule 13.05.2021
comment
@NathanOliver Этот вопрос, похоже, касается параметров функции, а не ее аргументов.   -  person D3V0N5H1R3    schedule 13.05.2021


Ответы (1)


Анонимное временное значение, переданное параметру (const ссылки) const std::string_view& str_view, сохраняется после вызова функции.

Так как существуют вложенные функции, анонимные временные файлы не уничтожаются до тех пор, пока, концептуально, не появится закрывающая точка с запятой

std::string output_str{ doSomething(doSomething(doSomething(input_str))) };
person Bathsheba    schedule 13.05.2021
comment
Правильно ли я вас понял, все std::string, используемые в качестве аргументов функции, не будут существовать только как временные объекты в начале вызова функции (для создания std::string_view)? Что означает, что они будут существовать как минимум до полного выполнения тела функции? - person D3V0N5H1R3; 13.05.2021
comment
@D3V0N5H1R3: Точно. Никакие std::string не будут уничтожены, пока вы не доберетесь до ;. И разрушаются они в порядке, обратном построению. - person Bathsheba; 13.05.2021
comment
Кроме того, есть ли смысл помещать const& в string_view? Мое впечатление было нет. - person wrhall; 13.05.2021