Последовательность между уничтожением локальных автоматических переменных функций и построением возвращаемого значения - PullRequest
3 голосов
/ 06 мая 2019

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

1) Удаление результата std :: type_info :: name

std::string demangle(const char* name)
{
    int status = -4;
    std::unique_ptr<char, void(*)(void*)> res {
        abi::__cxa_demangle(name, NULL, NULL, &status),
        std::free
    };
    return (status==0) ? res.get() : name;
}

2) Синхронизация защитных блокировок на основе области действия и возвращаемых значений

class C {
    mutable std::mutex _lock;
    map<string,string> deep_member;
public:
    auto get_big_lump()
    {
        std::unique_lock<std::mutex> lock(_lock);
        return deep_member;
    }
};

Где в стандарте указано, что этот заказ гарантирован?

Ответы [ 2 ]

8 голосов
/ 06 мая 2019

[stmt.return] / 3 :

Копирование-инициализация результата вызова выполняется до уничтожения временных файлов в конце полного цикла.выражение, установленное операндом оператора return, которое, в свою очередь, упорядочивается до уничтожения локальных переменных ([stmt.jump]) блока, содержащего инструкцию return.

2 голосов
/ 06 мая 2019

Вы отметили несколько языковых версий.Поэтому я отмечу, что цитата, которую приносит @songyuanyao, не всегда была там.В него были внесены поправки в DR 1885 , в которых подробно указано, как в операторе возврата было указано недостаточно.В частности, связанная с секвенированием формулировка отсутствовала в C ++ 14, и она была изменена в C ++ 17 в соответствии с DR.

Практически, ваш код, вероятно, также верен в C ++ 14.Продавцы имеют высокий стандарт QoI.

...