C++ Clang3.2的编译器问题还是我做错了?(可变模板和默认参数)

C++ Clang3.2的编译器问题还是我做错了?(可变模板和默认参数),c++,c++11,clang,variadic-templates,C++,C++11,Clang,Variadic Templates,在最新的库重写中,我对模板编程进行了深入研究,因此我制作了一个模板,用于组装位掩码,我想将其用作方法参数初始值设定项: test_scanner( unsigned int avec = CtrlVec<'\n','\r'>::mask ) ; 在CtrlVec周围放置一个()可以解决这个问题。我很好奇的是,它在以后的Clang版本中工作吗?或者我应该在编译器中作为一个可能的错误提交它,还是我做错了什么 整个测试用例如下所示: namespace test { // tem

在最新的库重写中,我对模板编程进行了深入研究,因此我制作了一个模板,用于组装位掩码,我想将其用作方法参数初始值设定项:

test_scanner( unsigned int avec = CtrlVec<'\n','\r'>::mask ) ;
在CtrlVec周围放置一个()可以解决这个问题。我很好奇的是,它在以后的Clang版本中工作吗?或者我应该在编译器中作为一个可能的错误提交它,还是我做错了什么

整个测试用例如下所示:

namespace test
{
    // template magic for building a bit mask from control characters
  template <char...> struct CtrlVec ; 
  template <char c> struct CtrlVec<c>
  { 
    static_assert( ( c < 0x20 ), "Only for control characters" ) ; 
    enum { mask = ( 1 << c ) } ; 
  } ; 
  template <char c, char... cs> struct CtrlVec<c, cs...>
  { 
    static_assert( ( c < 0x20 ), "Only for control characters" ) ; 
    enum { mask = ( 1 << c ) | CtrlVec<cs...>::mask } ; 
  } ; 

  static_assert( CtrlVec<'\0', '\001', '\002'>::mask == 0x7, "") ; 

    /// 

  class test_scanner
  { 
    public:
          // this version works fine in GCC, but gives an error in Clang 3.2
      test_scanner( unsigned int avec = CtrlVec<'\n','\r'>::mask ) ;

          // adding the () makes it work
      test_scanner( int good, unsigned int avec = ( CtrlVec<'\n','\r'>::mask ) ) ; 
  } ; 

} ;

int main() {}
名称空间测试
{
//用于从控制字符构建位掩码的模板魔术
模板结构CtrlVec;
模板结构CtrlVec
{ 
静态_断言((c<0x20),“仅用于控制字符”);

enum{mask=(1在clang++3.4上编译得很好,谢谢@DyP,我希望这只是一个暂时的问题。一旦Ubuntu升级,我会提醒自己清理()的。@DyP很有趣。苹果LLVM版本5.0(clang-500.2.79)(基于LLVM 3.3svn)上也有同样的问题.它基于3.3,所以并不令人震惊。@WhozCraig即使在coliru的3.4主干18中,问题仍然存在。。。
namespace test
{
    // template magic for building a bit mask from control characters
  template <char...> struct CtrlVec ; 
  template <char c> struct CtrlVec<c>
  { 
    static_assert( ( c < 0x20 ), "Only for control characters" ) ; 
    enum { mask = ( 1 << c ) } ; 
  } ; 
  template <char c, char... cs> struct CtrlVec<c, cs...>
  { 
    static_assert( ( c < 0x20 ), "Only for control characters" ) ; 
    enum { mask = ( 1 << c ) | CtrlVec<cs...>::mask } ; 
  } ; 

  static_assert( CtrlVec<'\0', '\001', '\002'>::mask == 0x7, "") ; 

    /// 

  class test_scanner
  { 
    public:
          // this version works fine in GCC, but gives an error in Clang 3.2
      test_scanner( unsigned int avec = CtrlVec<'\n','\r'>::mask ) ;

          // adding the () makes it work
      test_scanner( int good, unsigned int avec = ( CtrlVec<'\n','\r'>::mask ) ) ; 
  } ; 

} ;

int main() {}