以下のコードは、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では直るかも、とのこと。