函数的异常安全性

Exception safety of std::function

本文关键字:安全性 异常 函数      更新时间:2023-10-16

我尝试了一下,但没有成功找到这段代码是否会抛出异常:

std::function<void(void)>f=[]{};

根据标准,std::函数的复制或移动构造函数不是noexcept。但是我猜缺少noexcept关键字是由于std::function也包装了用户定义的函数对象,其复制或移动构造函数可能抛出。

在我的情况下,异常似乎不太可能,但这是可能的吗?

在我的情况下,异常似乎不太可能,但这是可能的吗?

原则上,是的。std::function必须分配内存来存储它初始化的可调用对象,如果内存是动态分配的,那么就有失败的可能性。

实际上,在你的情况下,没有。用规范中的注释的话来说,"鼓励实现避免为小型可调用对象使用动态分配的内存"。没有捕获的lambda可转换为函数指针,这与可调用对象的大小差不多;所以一个好的实现当然应该在没有动态分配的情况下存储它。当然,复制指针也不会抛出。

较大的对象(包括具有许多捕获的lambdas)将需要动态分配,并且需要复制它们捕获的对象或其他状态,因此不能提供无抛出保证。