7

我尝试查找此代码是否会引发异常但没有成功:

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

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

就我而言,例外似乎不太可能,但有可能吗?

4

1 回答 1

8

就我而言,例外似乎不太可能,但有可能吗?

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

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

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

于 2013-05-21T08:51:03.380 回答