Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ symbols移动结果,因此将其从symbol_解析器本身中移除_C++_Boost_Boost Spirit_Boost Spirit X3 - Fatal编程技术网

C++ symbols移动结果,因此将其从symbol_解析器本身中移除

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中

因此,我在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中找到了错误源:

如您所见,
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);
}