2

boost::phoenix::functionパラメータを使用してラムダ関数に基づいて呼び出そうとしましたが 、失敗しました。このようにパラメータなしで呼び出すと、次のようになります。

const auto closure = [](){
    cout<< "test" << endl;
};

typedef decltype(closure) ClosureType;
const boost::phoenix::function<ClosureType> lazyFunc (std::move(closure));
lazyFunc()();

すべてがうまくコンパイルされます。しかし、ラムダの少なくとも1つのパラメーターを宣言すると、次のようになります。

const auto  closure = [](int& param)  { cout<<"Test" << param << endl; };

typedef decltype(closure) ClosureType;
const boost::phoenix::function<ClosureType> lazyFunc (std::move(closure));
lazyFunc(arg1)(a);

コンパイルは、 boost::result_ofの奥深くにある途方もないスタックトレースで失敗します

4

1 に答える 1

2

エラーが Boost.ResultOf のどこか深いところを指していると仮定すると (このデモで見られるように)、ラムダ式のクロージャー型が ResultOf プロトコルを実装していないことが原因です。

これに対するやや簡単な回避策は、 define を使用することです。BOOST_RESULT_OF_USE_DECLTYPEこれにより、代わりに を使用して戻り値の型を計算することboost::result_ofで、独自の ResultOf プロトコルをバイパスします。decltypeこれは、(Boost 1.51 のリリース時点で) 多くのコンパイラがこの機能を動作させるのに十分な適合性を持っていないため、デフォルトでは有効になっていません。このシンボルは、1.52 で処理できるコンパイラに対して (Boost.Config によって) 自動的に定義される予定です。

これはBoost.Phoenixdecltypeを-poweredで使用した場合のデモですboost::result_of。どうやら として転送されているため、int&をに変更する必要がありました。これは の基本的な制限のようです。使用にはこの問題はありません。int const&iconst intboost::phoenix::functionboost::phoenix::val

于 2012-10-21T03:21:33.450 に答える