为什么 std::find_if 可能会因 std::bad_alloc 异常而失败?

正如我在标题中所说,我只是不明白为什么这个函数会抛出 std::bad_alloc 。如果我们看一下 cppreference ,所有三种可能的实现都与某人假设的一样,并且看起来没有特别需要动态内存分配。

stack overflow Why can std::find_if potentially fail with std::bad_alloc exception?
原文答案
author avatar

接受的答案

cppreference 中显示的 3 个可能的实现是针对不采用执行策略的 3 个重载。具体来说,重载确实采用了被明确列为可能抛出 std::bad_alloc 的执行策略。

执行策略涉及并行化或矢量化操作的可能性。这将需要额外的内存来完成,而不仅仅是依赖非并行化/矢量化版本中的标量变量。

编辑:也就是说,正如@user17732522 在评论中所说:

默认情况下,允许没有 noexcept 规范的标准库函数抛出实现定义的异常( see eel.is/c++draft/res.on.exception.handling#4 ),并且 find_if 没有任何“Throws:”子句限制它( eel.is/c++draft/alg.find )。

所以允许实现提供一个 std::find ,它会抛出任何重载。


答案:

作者头像

这是因为模板中的执行策略。

“C++ 标准允许并行算法分配内存,并在无法获取内存时抛出 std::bad_alloc”

https://devblogs.microsoft.com/cppblog/using-c17-parallel-algorithms-for-better-performance/

相关问题