存储在变量模板专业化中的 Spirit-X3 解析器不适用于 Clang

Spirit-X3 parsers stored in variable template specializations not working on Clang

我有一个工作的 Spirit-X3 解析器,它可以解析两个密切相关的语法,用于设置草稿和跳棋位置。我定义了两个 变量模板特化 作为语法的两种方言的解析器:

// general variable template
template<class Format>
auto const position = []{};

// template specialization for algebraic notation (squares of the form "a1"-"h8")
template<>
auto const position<ast::ALG> = attribute_cast<ast::position<ast::ALG>> 
( 
    /* code depending on ast::ALG, omitted for brevity */
);

// template specialization for numeric notation (squares numbered 1 through N)  
template<>          
auto const position<ast::NUM> = attribute_cast<ast::position<ast::NUM>> 
( 
    /* code depending on ast::NUM, omitted for brevity */
);

这段代码在 Clang and on g++.

上编译并正确解析了我的测试输入

由于两个变量模板特化依赖于完全相同形式的模板参数,我想将它们合并到一个通用变量模板中:

template<class Format>
auto const position = attribute_cast<ast::position<Format>> 
( 
    /* code depending on Format, omitted for brevity */
); 

这也为 g++. It also compiles for Clang, but it only parses correctly my input on Wandbox, and not on Coliru. On my own dev box, with clang-3.8.0 from apt.llvm.org 正确编译和解析,我得到了与 Coliru 相同的错误行为。

问题:Clang 中是否存在变量模板特化的错误?如何以与 Wandbox 上相同的方式配置 Clang 以解决该错误?还是某种程度上与 Spirit-X3 相关的错误?

在测试其他编译器后,这在 Clang 中出现了 变量模板代码生成错误,因为代码正确解析了 g++ 中的所有内容。

除了上面的显式特化问题之外,Clang 还在没有显式特化的变量模板 Spirit-X3 解析器上阻塞(即编译但发出无法解析输入的错误代码):

template<class Format>
auto piece_list = piece >> file >> rank;

template<>
auto const piece_list<ast::NUM> = piece >> square >> -('-' >> square);

Live Example 这里只解析数字形式的位置字符串,错误处理所有代数字符串(没有给出明确的专门化)。

并且仅当通用变量模板专用于将调用的所有情况时才有效:

template<class Format>
auto piece_list = 0;

template<>
auto const piece_list<ast::ALG> = piece >> file >> rank;

template<>
auto const piece_list<ast::NUM> = piece >> square >> -('-' >> square);

我一直无法找到隔离 Clang 错误的小型简化测试用例。