8

バインドされたメンバー関数から述語を作成する必要があるため、boost::function<bool(SomeObject const &)>. それは問題ないようですが、1つのケースでそれを否定する必要もありました。でも

boost::function<bool(SomeObject const &)> pred;
std::not1(pred);

MSVC++ 9.0 (Visual Studio 2008) でコンパイルされず、参照への参照が無効であると不平を言う:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\functional(213) : warning C4181: qualifier applied to reference type; ignored
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\functional(213) : error C2529: '_Left' : reference to reference is illegal

問題は、 asをboost::function定義し、インスタンス化された by が内部的に使用しようとし、既に参照されているため、コンパイラがそれを拒否することです。C++11 でコンパイルできることは確かですが、これは C++03 のみの古いコンパイラです。だから私はそれが誰のせいなのか知りたい:argument_typeSomeObject const &std::unary_negate<_Fn1>std::not1const typename _Fn1::argument_type&T::argument_type

  • コンパイラの、参照を折りたたむ必要があるため(明らかにそうではありません)
  • 標準ライブラリの、参照を取るファンクターを処理する準備ができている必要があるため (仕様では引数で定義unary_negateされているため、明らかにそうではありません)、const typename Predicate::argument_type& x
  • ブーストの、argument_type実際の引数が or の場合でも参照されるべきではないため
  • boost::function参照引数と一緒に使用してはならないので、私のものですか?
4

1 に答える 1