c++ - std::any_of 与顺序执行策略一起使用时是否保证迭代顺序?

标签 c++ std

我有一个过滤函数列表。如果这些函数中的任何一个返回“true”,我就不应该进一步处理事件。

std::any_of 似乎适合这个用例,但我希望保证过滤器函数按照它们添加到我的列表中的顺序被调用(因为它们可能有副作用)。 因此,如果我使用 std::any_of,我需要知道它调用过滤器函数的顺序是确定的,从列表的 begin() 到 end()。

我检查了 std::any_of 上的 C++ 标准和顺序执行策略,但没有提到顺序保证。我没有在 cppreference 上找到关于订单保证的提及,也没有在 stackoverflow 上找到足够相似的已回答问题。

我的结论是没有订单保证。虽然大多数编译器可能会按我的顺序处理函数,但我不应该依赖它。

bool MyClass::event(QEvent* event)
{
    std::vector<std::function<bool(QEvent*)> > functionList = getCurrentEventFilters();

    const auto bFilter = std::any_of(functionList .begin(),
                                     functionList .end(),
                                     [&event](std::function<bool(QEvent*)> function) {return function(event);});
    if (bFilter)
    {
        return true;
    }

    return Base::event(event);
}

最佳答案

关于 std::execution::sequenced_policy :

The invocations of element access functions in parallel algorithms invoked with this policy (usually specified as std::execution::seq) are indeterminately sequenced in the calling thread.

关于 indeterminately-sequenced :

evaluations of A and B are indeterminately sequenced: they may be performed in any order but may not overlap: either A will be complete before B, or B will be complete before A.

对我来说,这似乎是一个明确的声明,即你不能依赖事物的顺序。
没想到这个。。

原则上,这对您来说应该无关紧要。在有副作用的东西上调用 std::any_ofstd::all_of 似乎很可疑。

关于c++ - std::any_of 与顺序执行策略一起使用时是否保证迭代顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57588668/

相关文章:

c++ - 为什么在全局范围和命名空间 std 中都定义了 size_t?

c++ - 我需要使用 'using namespace std' 命令吗?

c++ - std::引用对

c++模板不带参数使用

c++ - C++ 是否可以获取对象所包含文件的名称?

引擎盖下的c++字符串构造函数

c++ - 获取指针指向的对象

c++ - OpenCV (C++) 拼接器不写入 OutputArray

c++ - std::function 与标准函数

c++ - 如果 std::endl 是一个函数,它如何不使用任何括号?