Уничтожены ли местные жители до или после вычисления возвращаемого значения функции?

Я думаю о создании класса, который представляетвладение примитива синхронизации, что-то вроде этого:

class CCriticalSectionLock
{
public:
    CCriticalSectionLock( CCriticalSection &cs ) : cs( cs )
    { cs.Enter(); }
    ~CCriticalSectionLock()
    { cs.Leave(); }
private:
    CCriticalSection &cs;
};

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

int MyMethod( void )
{
    not_locked(); // do something not under lock

    CCriticalSectionLock myLock( someCriticalSection );

    locked(); // do something under lock

    return ...; // some expression
}

AFAIK, правила жизни C ++ гарантируют, чтоnot_locked() будет называтьсядо замок взят, и этоlocked() будет вызван, пока блокировка удерживается.

Тем не менее, я не совсем понимаю, когда именно будет вычислено возвращаемое выражение.относительно точки, в которой вызывается деструктор блокировки, Гарантируется ли, что выражение будет оцененодо деструктор? Я бы так подумал, но я не уверен на 100%, и в противном случае это может привести к очень тонким, прерывистым, труднодоступным ошибкам!

Ответы на вопрос(1)

Ваш ответ на вопрос