std :: function的异常安全性

Arn*_*aud 4 c++ exception function language-lawyer c++11

我试图找到这个代码是否会引发异常,但没有成功:

std::function<void(void)>f=[]{};
Run Code Online (Sandbox Code Playgroud)

根据标准,std :: function的复制或移动构造函数不是noexcept.但我想缺少noexcept关键字是因为std :: function还包装了用户定义的仿函数对象,其副本或移动构造函数可以抛出.

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

Mik*_*our 7

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

原则上,是的.std::function将不得不分配内存来存储它初始化的可调用对象,如果该内存是动态分配的,那么就有可能失败.

在实践中,在你的情况下,没有.在说明书中的注释中,"鼓励实现避免为小型可调用对象使用动态分配的内存".没有捕获的lambda可以转换为函数指针,它与可调用对象一样小; 所以一个好的实现肯定应该存储没有动态分配.当然,复制指针也不能抛出.

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