我有一些简单的代码来解析一些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_]]的短msg类型。
当我试图重构到下面的内容时,
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, "")];该代码将编译,但当我运行我的单元测试时,它将在运行时异常情况下死亡。
有人知道为什么这是来自圣灵的行为吗?
发布于 2018-05-27 10:04:08
您不能安全地使用auto与精神分析器表达式。参见例如boost spirit V2 qi bug associated with optimization level
然而,它看起来也像是
"",请参阅Assign default value to variable using boost spirit。https://stackoverflow.com/questions/50549407
复制相似问题