所以我尝试使用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
答案 0 :(得分:4)
这是一个错误;谢谢找到它。对谓词的评估总是比严格必要的时间多一次。该错误由this commit修复,它将进入Boost 1.64.0。
据说,Hana的文档专门禁止您依赖此(并且在您发送给算法的函数中也有副作用):http://boostorg.github.io/hana/#tutorial-algorithms-effects。因此,虽然从性能角度来看它是一个错误,但严格来说并不是一个错误,因为它不会破坏图书馆给你的合同。
我之所以无法完成函数合同的这一部分,原因在于它可能会阻止某些实现策略的有效性,我希望保持这种自由。如果用例引人注目,我会更认真地考虑它,但似乎不是。