Я пытаюсь решить, является ли следующий код безопасным, или это UB, и он работает только в этом случае (запустите его здесь ):
#include <iostream>
#include <mutex>
struct Foo
{
std::mutex mutex;
~Foo()
{
std::lock_guard<std::mutex> lock(mutex);
}
};
int main()
{
{
Foo foo;
}
std::cout << "everything seems to work fine...?" << std::endl;
}
В частности, мы гарантируем, что локальные переменные, определенные внутри деструктора, будут уничтожены до того, как переменные-члены будут?
Я нашел следующее на cppreference.com , но, похоже, он не полностью отвечает на мой вопрос:
Последовательность уничтожения
Как для пользовательских, так и для неявно определенных деструкторов, после выполнения тела деструктора компилятор вызывает деструкторы для всех нестатических не вариантных членов класса в обратном порядке объявления, затем он вызывает деструкторы всех прямых невиртуальных базовых классов в обратном порядке построения (которые в свою очередь вызывают деструкторы их членов и их базовые классы и т. д.), а затем, если этот объект принадлежит к самому производному классу, он вызывает деструкторы всех виртуальных баз.