函数的异常安全性
Exception safety of std::function
我尝试了一下,但没有成功找到这段代码是否会抛出异常:
std::function<void(void)>f=[]{};
根据标准,std::函数的复制或移动构造函数不是noexcept。但是我猜缺少noexcept关键字是由于std::function也包装了用户定义的函数对象,其复制或移动构造函数可能抛出。
在我的情况下,异常似乎不太可能,但这是可能的吗?
在我的情况下,异常似乎不太可能,但这是可能的吗?
原则上,是的。std::function
必须分配内存来存储它初始化的可调用对象,如果内存是动态分配的,那么就有失败的可能性。
实际上,在你的情况下,没有。用规范中的注释的话来说,"鼓励实现避免为小型可调用对象使用动态分配的内存"。没有捕获的lambda可转换为函数指针,这与可调用对象的大小差不多;所以一个好的实现当然应该在没有动态分配的情况下存储它。当然,复制指针也不会抛出。
较大的对象(包括具有许多捕获的lambdas)将需要动态分配,并且需要复制它们捕获的对象或其他状态,因此不能提供无抛出保证。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 类与私有变量的其他类之间的线程安全性
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- C++隐式生成的赋值运算符的异常安全性
- 提高异常和线程安全性 - 优于常规异常处理
- 了解shared_ptr::void reset(U*p);的异常安全性;
- 可能失败的函数的接收参数和移动语义(强异常安全性)
- 函数的异常安全性
- 自包含应用程序中的异常安全性