Phoenix.bindとLambda.bind

Phoenix.bind VS Lambda.bind


以下のコードは、Boost.Lambdaのbindでは動作しますが、
Boost.Sprit.Phoenixのbindではコンパイルエラーとなります。

void foo(int i) {}

bind(foo, _1)(10);

LambdaとPhoenixの違いは、Lambdaのbindが引数として値(と参照)をとるのに対し、
Phoenixのbindは引数として参照をとるというところです。
そのため、Phoenixのbindの場合は、boost::crefを使って値を渡す必要があります。

// Lambda.bind
#include <boost/lambda/bind.hpp>
using boost::lambda::bind;
using boost::lambda::_1;

void foo(int i) {}

int main()
{
    int i = 0;
    bind(foo, _1)(i);

    bind(foo, _1)(10);
}
// Phoenix.bind
#include <boost/ref.hpp>
#include <boost/spirit/home/phoenix/core/argument.hpp>
#include <boost/spirit/home/phoenix/bind/bind_function.hpp>
using boost::phoenix::bind;
using boost::phoenix::arg_names::_1;

void foo(int i) {}

int main()
{
    int i = 0;
    bind(foo, _1)(i);

    bind(foo, _1)(boost::cref(10));
}

この問題は、Phoenix v3では直るかも、とのこと。