我有一些简单的代码来解析一些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的行为?
答案 0 :(得分:0)
您无法使用Spirit Parser Expressions安全地使用auto
。参见例如boost spirit V2 qi bug associated with optimization level
但是,它看起来也像
""
,请参阅Assign default value to variable using boost spirit