提升哈娜any_of?

Boost Hana any_of?

于是我尝试使用Boost Hana的any_of方法,但是与实现中的描述不同,它仍然调用最先满足谓词的元素之后的元素。这是已知错误吗?

这是一个 MCVE:

#include <iostream>
#include <boost/hana.hpp>

int main() {
    auto t = boost::hana::tuple_t<int, double, float>;
    boost::hana::any_of(t, [](auto) { std::cout << "Called\n"; return true; });
}

输出:

Called
Called

这是一个错误;感谢您找到它。谓词总是比绝对必要的多评估一次。该错误已由 this commit 修复,它将进入 Boost 1.64.0。

话虽这么说,Hana 的文档明确禁止您依赖它(并且在您发送给算法的函数中也会产生副作用):http://boostorg.github.io/hana/#tutorial-algorithms-effects。因此,虽然从性能的角度来看我认为它是一个错误,但严格来说它不是一个错误,因为它不会违反图书馆给你的合同。

我之所以不能把这部分契约做成函数,是因为它可能会阻止一些实现策略生效,我想保留这个自由。如果用例令人信服,我会更认真地考虑它,但它似乎并非如此。