push_back_aが誤動作?


boost::spirit::push_back_a(dst, val)

が正常に動いていないような気がします.


#include <boost/spirit.hpp>
#include <boost/lambda/bind.hpp>
#include <iostream>
#include <string>
#include <vector>


struct TestGrammar : boost::spirit::grammar<TestGrammar> {

  std::vector<int>& ret;

  TestGrammar(std::vector<int>& ref):
  ret(ref){
  }

  template<typename ST>
  struct definition {

    typedef boost::spirit::rule<ST> rule_t;
    rule_t r;
    rule_t s;

    definition(const TestGrammar& self){

      using namespace boost::spirit;
      using namespace boost::lambda;

      r = int_p[push_back_a(self.ret)];
      s = int_p[push_back_a(self.ret, 0)];
      t = int_p[bind(&std::vector<int>::push_back, var(self.ret), 0)];

    }

    const rule_t& start() const{ return r; }
  };
};


int main(){


  std::string str = "425";
  std::vector<int> v;

  if(boost::spirit::parse(str.begin(), str.end(), TestGrammar(v)).full)
    std::cout << v[0] << std::endl;

}


非常に単純な例です.


ルールにrを使った場合は425と出ますが,sを使った場合は未定義値(0xccccccccとか)がでます.

Boost.Lambaを使ったtだととうまくいきます.


うーん,使い方が間違ってるのかな….