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() {}