问题标签 [scopeguard]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++11 - 使用 std::unique_ptr 和 lambdas 推进对象的状态
在推进对象的状态时,使用std::swap
对简单对象和指针交换非常有效。对于其他就地操作,Boost.ScopeExit
效果相当好,但如果您想跨函数共享退出处理程序,它并不是非常优雅。是否有 C++11 本机方式来完成类似Boost.ScopeExit
但允许更好的代码重用的事情?
c++ - ScopeGuard 在一个函数中使用多个资源分配和退出点
我在一个函数中分配了多个资源,因此有很多指针,我必须在离开函数之前返回一个指针(比如说 ret_ptr)并释放其他指针(所有 othr_ptr)。
我在此函数中有多个退出点(其中 ret_ptr 为 0 或指向有效内存或异常)。因此,在所有返回语句和异常(捕获块)之前,我必须删除 othr_ptrs(在函数中多次执行)。“ScopeGuards”有什么办法可以减少多次清理吗?
c++ - ScopeGuard11 和 Boost.ScopeExit 之间的区别 - 只是向后兼容?
我最近观看了 Andrei Alexandrescu 在 'C++ and Beyond 2012'(使用 C++ 的系统错误处理)中的演讲,他在其中讨论了他的 ScopeGuard11 构造,特别是SCOPE_EXIT
(演讲的第二部分;或者只是在这里阅读代码)。同时,我开始研究 Boost 库,并注意到BOOST_SCOPE_EXIT
宏(Boost.ScopeExit 库)。
这两个在实现方面似乎完全不同(BOOST_SCOPE_EXIT
使用Boost.TypeOf
,与 ScopeGuard11 中的完全不同SCOPE_EXIT
);并且 Boost 宏与参数捕获等有关,这在 C++11 中不是什么问题;但除此之外,它们似乎提供了基本相同的功能。
我是对的还是我错过了什么?有人可以说 ScopeGuard11 是一种“更干净”的机制,具有与 Boost.ScopeGuard 相同的功能,但向后兼容性较差?
c++ - 范围保护/范围退出习语是否会标准化?
在范围出口上运行 lambda 似乎是一件基本的事情,我希望它是标准化的。类似的东西unique_ptr
在应用时会更好,但我发现需要无穷无尽的“一次性”析构函数,尤其是在利用 C 风格的库时。有谁知道这是否即将到来?
c++ - C++:为什么这个简单的 Scope Guard 有效?
到目前为止,每个查看的范围守卫都有一个守卫布尔变量。例如,请参阅此讨论: 最简单和最整洁的 c++11 ScopeGuard
但是一个简单的守卫工作(gcc 4.9,clang 3.6.0):
为什么没有临时副本被破坏?依赖这种行为有危险吗?
c++ - C++:另一种简单的范围保护
让我们问一下这个简单的范围保护:
在这里依靠破坏令安全吗?即是否可以安全地假设~finop_t()
将在 lambda 析构函数之前调用?
c++ - 使用范围保护时如何避免警告?
我正在使用愚蠢的范围保护,它正在工作,但它会生成一个警告,指出该变量未使用:
编码:
如何避免这样的警告?
c++ - 有什么方法可以延长 C++ 中临时对象的生命周期?
我写了一个作用域守卫,它在作用域退出时重置一个值:
当这个范围保护从函数返回时,如果没有保存,有什么方法可以防止立即销毁范围保护?
例如:
按照现在的编写方式,任何调用其中一个函数的人都必须记住始终将 ResetGuard 保存到局部变量,否则它会立即重置该值。
围绕我正在尝试做的事情的一些背景
我正在编写一个库来格式化和操作字符串。我有一个全局变量来控制浮点数的格式。我知道全局变量通常是一个糟糕的主意,但请多多包涵。
我决定谨慎使用全局变量。使用全局变量的替代方法是传递包含格式化规范的对象。这个选项最终被证明是不可行的:我的库旨在处理任何提供隐式转换为std::string
. 无法将格式化选项(或任何参数,实际上)传递给隐式转换函数。因此,我不得不求助于使用全局变量。
c++ - 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
使用 C++20 P0052的scope_guard
s(以及许多其他类型的范围保护),请考虑以下典型用例:
代码依赖于 lambda 表达式本身(闭包对象的构造)不会抛出。C++ 标准如何保证这一点?
我阅读了标准的章节(第 7.5.5 节 Lambda 表达式),发现没有关于noexcept
lambda 构造函数的说法。