提升精神语法问题

时间:2018-05-27 05:52:37

标签: c++ boost boost-spirit boost-spirit-qi

我有一些简单的代码来解析一些msg,如下所示,

if (msgtype == BATSAddOrderMsg::longMsgCode)
    m_wire_msg = ( p_ts >> qi::char_(BATSAddOrderMsg::longMsgCode)
                        >> p_orderId
                        >> qi::char_(BATSAddOrderMsg::sideFlag)
                        >> p_shares
                        >> qi::as_string[qi::repeat(6)[qi::char_]]
                        >> m_price
                        >> qi::char_(BATSAddOrderMsg::displayFlag)
                        >> qi::as_string[qi::repeat(4)[qi::char_]] )
                        [qi::_val = phi::construct<BATSAddOrderMsg>(
                                qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, qi::_9)];
else if (msgtype == BATSAddOrderMsg::shortMsgCode)
    m_wire_msg = ( p_ts >> qi::char_(BATSAddOrderMsg::shortMsgCode)
                        >> p_orderId
                        >> qi::char_(BATSAddOrderMsg::sideFlag)
                        >> p_shares
                        >> qi::as_string[qi::repeat(6)[qi::char_]]
                        >> m_price
                        >> qi::char_(BATSAddOrderMsg::displayFlag) )
                        [qi::_val = phi::construct<BATSAddOrderMsg>(
                                qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, "")];

在上面,长msg类型只是短消息类型,另外还有一个字段qi::as_string[qi::repeat(4)[qi::char_]]

当我尝试重构到下面时,

auto shared = p_ts >> qi::char_(BATSAddOrderMsg::longMsgCode)
                   >> p_orderId
                   >> qi::char_(BATSAddOrderMsg::sideFlag)
                   >> p_shares
                   >> qi::as_string[qi::repeat(6)[qi::char_]]
                   >> m_price
                   >> qi::char_(BATSAddOrderMsg::displayFlag);
if (msgtype == BATSAddOrderMsg::longMsgCode)
   m_wire_msg = shared >> qi::as_string[qi::repeat(4)[qi::char_]] )
                       [qi::_val = phi::construct<BATSAddOrderMsg>(
                              qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, qi::_9)];

else if (msgtype == BATSAddOrderMsg::shortMsgCode)
    m_wire_msg = shared[qi::_val = phi::construct<BATSAddOrderMsg>(                                
    qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, "")];

代码会编译,但是当我运行我的单元测试时,它会因运行时异常而死亡。

任何人都知道为什么来自Boost Spirit的行为?

1 个答案:

答案 0 :(得分:0)

您无法使用Spirit Parser Expressions安全地使用auto。参见例如boost spirit V2 qi bug associated with optimization level

但是,它看起来也像