C++ : other one simple scope guard

标签 c++ exception-safety scopeguard

<分区>

让我们问你这个简单的作用域守卫:

template <class T>
struct finop_t {
    T& t;
    ~finop_t() { t(); }
};
#define FINALLY__(l, cl) \
    auto FIN ## l ## clo = cl; \
    finop_t<decltype(FIN ## l ## clo)> FIN ## l ## fin { FIN ## l ## clo}
#define FINALLY_(l, cl) FINALLY__(l, cl)
#define FINALLY(...) FINALLY_(__LINE__, ([=](){__VA_ARGS__}))

int main() {
    FINALLY( std::cout << "hello" << std::endl ; );
    std::cout << "one" << std::endl;
    FINALLY( std::cout << "world" << std::endl ; );
    std::cout << "second" << std::endl;
    return 0;
}

在这里依赖销毁命令安全吗?即假设 ~finop_t() 将在 lambda 析构函数之前被调用是否安全?

最佳答案

是的,它是安全的。宏将 lambda 存储在局部变量中。局部变量的销毁顺序是固定的(与构造顺序相反)。因此可以保证 ~finop_t() 析构函数在相应的 lambda (FIN ## l ## clo) 析构函数之前被调用。

关于C++ : other one simple scope guard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31925473/

相关文章:

c++ - ScopeGuard 在一个函数中使用多个资源分配和退出点

c++ - 动态创建的作用域守卫

c++ - 如何与调试器交谈,或更改异常消息?

c++ - 在代码中创建 argc argv

c++ - 删除二维数组使用内存?

c++ - 在 VS 2005(8) IDE 中使用 GCC

c++ - 声明 POD 类型会抛出异常吗?

c++ - 使用 c++ 和 glfw 的 raii 架构

go - 调用 log.Fatalln 时是否调用延迟函数?

c++ - 通过 const 引用延长临时生命周期