C++ BOOST_SCOPE_EXIT在幕后做什么?

C++ BOOST_SCOPE_EXIT在幕后做什么?,c++,boost,C++,Boost,为了理解作用域出口块在自动变量的释放位置执行的位置,我编写了以下程序: #include <boost/scope_exit.hpp> #include <iostream> class A { public: A() { std::cout << "A's constructor" << std::endl; } ~A() { std::cout << "A

为了理解作用域出口块在自动变量的释放位置执行的位置,我编写了以下程序:

#include <boost/scope_exit.hpp>
#include <iostream>

class A
{
  public:
    A()
    {
        std::cout << "A's constructor" << std::endl;
    }
    ~A()
    {
        std::cout << "A's destructor" << std::endl;
    }
};

class B
{
  public:
    B()
    {
        std::cout << "B's constructor" << std::endl;
    }
    ~B()
    {
        std::cout << "B's destructor" << std::endl;
    }
};

int main()
{
    A a;
    BOOST_SCOPE_EXIT()
    {
        std::cout << "Scope exit 1" << std::endl;
    } BOOST_SCOPE_EXIT_END
    B b;
    BOOST_SCOPE_EXIT()
    {
        std::cout << "Scope exit 2" << std::endl;
    } BOOST_SCOPE_EXIT_END
    std::cout << std::endl;
    return 0;
}

自动变量和范围出口块之间有一个共同的顺序。我想知道boost是如何做到这一点的?BOOST\u SCOPE\u EXIT宏是否在堆栈上创建了一个对象,其析构函数执行EXIT块?

BOOST\u SCOPE\u EXIT确实最终创建了一个局部变量,其析构函数包含您的代码。析构函数按相反的构造顺序执行,因此退出处理程序将自下而上执行,其他对象的销毁将交错进行。

你的怀疑是对的。它创建一个对象,其析构函数执行该块。发件人:

警告:实现在析构函数中执行作用域退出体,因此作用域退出体决不能抛出,以符合STL异常安全要求

另外,在C++11中,我个人更喜欢基于执行lambda函数的helper类,而不是boost宏。这对我来说似乎干净多了,而且可能更容易发现实际发生的事情

A's constructor
B's constructor

Scope exit 2
B's destructor
Scope exit 1
A's destructor