C++ symbols移动结果,因此将其从symbol_解析器本身中移除
因此,我在boost 1.59中提供的boost::spirit::x3中遇到了奇怪的行为: 我通过以下方式定义了“动态”符号表: 现在,随着符号表嵌入到必要的规则中,当解析输入字符串时,如C++ symbols移动结果,因此将其从symbol_解析器本身中移除,c++,boost,boost-spirit,boost-spirit-x3,C++,Boost,Boost Spirit,Boost Spirit X3,因此,我在boost 1.59中提供的boost::spirit::x3中遇到了奇怪的行为: 我通过以下方式定义了“动态”符号表: 现在,随着符号表嵌入到必要的规则中,当解析输入字符串时,如 mov r2 r1 mov r1 @80 生成的ast仅包含第一个mov及其操作数。 缺少第二个mov,但已正确解析操作数。 打印生成的AST时,可能如下所示: mov r2 r1 r1 @80 使用调试器,我在symbol\u parser::parse()中的symbols.hpp中
mov r2 r1
mov r1 @80
生成的ast仅包含第一个mov
及其操作数。
缺少第二个mov,但已正确解析操作数。
打印生成的AST时,可能如下所示:
mov r2 r1
r1 @80
使用调试器,我在symbol\u parser::parse()
中的symbols.hpp中找到了错误源:
如您所见,src
是我在symbol\u解析器中添加的操作码实例,它被移动了。这意味着在第一次调用之后,它将再次为空,这就是为什么只显示第一条指令。简单地说,它被移出了符号表
现在我的问题终于出来了:
这是一个bug还是我犯了一个错误?正如sehe建议的,我的解决方法是: 我找到了一个临时解决方法:通过将模板参数声明为const,可以抑制移动语义。然后调用复制选择器
例如:
x3::symbols
。感谢您提供示例。这正是我所经历的行为。我找到了一个临时解决方法:通过将模板参数声明为const,可以抑制移动语义。然后调用复制选择器。例如:x3::SYMBOLS您能否将解决方案作为答案和缺陷提交给github的Boost Trac/a PR?精彩的观察!感谢您的回复@sehe。我在boost trac中提交了一个bug,我不确定是否可以提交PR。我必须调查一个正确的修复方法。
mov r2 r1
mov r1 @80
mov r2 r1
r1 @80
template <typename Iterator, typename Context, typename Attribute>
bool parse(Iterator& first, Iterator const& last
, Context const& context, unused_type, Attribute& attr) const
{
x3::skip_over(first, last, context);
if (value_type* val_ptr
= lookup->find(first, last, get_case_compare<Encoding>(context)))
{
x3::traits::move_to(*val_ptr, attr); //<- the error originates from here
return true;
}
return false;
}
template <typename T>
inline void move_to(T& src, T& dest)
{
if (boost::addressof(src) != boost::addressof(dest))
dest = std::move(src);
}