3

So I tried to use Boost Hana's any_of method, but unlike the description in the implementation, it still calls the element after the element that first satisfied the predicate. Is this a know bug ?

Here is an 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; });
}

Output:

Called
Called
4

1 回答 1

4

这是一个错误;感谢您找到它。谓词总是比严格必要的多评估一次。此提交修复了该错误,它将进入 Boost 1.64.0。

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

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

于 2017-02-03T21:59:51.373 回答