2017-02-02 2 views
3

私はBoost Hanaのany_ofメソッドを使用しようとしましたが、実装の記述とは異なり、述語を最初に満たした要素の後に要素を呼び出します。これは既知のバグですか?ここで ブーストハナ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 
+3

[MCVE](http://stackoverflow.com/help/mcve)を投稿してください。 –

+0

文書の中には、複数の要素に述語を満たすものがあっても、複数の要素には適用されないという記述はありません。実装を読むと、動作は私が期待しているものと一致します。私はそれが直観に反するかもしれないと同意することはできますが、個人的にそれを違ったものにしてしまうでしょう、述語に副作用がある陳述も一般的には眉をひそめます。 – GManNickG

+0

http://www.boost.org/doc/libs/1_63_0/libs/hana/doc/html/structboost_1_1hana_1_1detail_1_1any__of.html – Yamahari

答えて

4

。それを見つけることに感謝します。述語は常に厳密に必要とされるよりももう一度評価されました。バグはthis commitで修正され、Boost 1.64.0に移行します。

これはと言われていますが、Hanaのマニュアルではこれに頼ることは特に禁止されています(アルゴリズムに送信する機能にも副作用があります):http://boostorg.github.io/hana/#tutorial-algorithms-effects。だから私はそれをパフォーマンスの観点から考えるとバグではありませんが、それはライブラリによって与えられた契約を壊さないので、厳密に言えばバグではありません。

私がこの機能の契約の一部を成し遂げることができない理由は、いくつかの実装戦略が有効であるのを妨げる可能性があり、私はこの自由を保つことです。私は、ユースケースが魅力的であれば、もっと真剣に考えていますが、そうではないようです。