C++ 使用sizeof。。。在std::启用_if

C++ 使用sizeof。。。在std::启用_if,c++,c++11,variadic-templates,template-meta-programming,enable-if,C++,C++11,Variadic Templates,Template Meta Programming,Enable If,下面的代码没有编译,我就是不明白为什么 template <class T, class... Ts> typename std::enable_if<sizeof...(Ts) > 0>::type func() { // nop } 模板 typename std::enable_if 0>::type func(){ //不 } 生成的错误消息是: error: expected unqualified-id before numeric consta

下面的代码没有编译,我就是不明白为什么

template <class T, class... Ts>
typename std::enable_if<sizeof...(Ts) > 0>::type func() {
  // nop
}
模板
typename std::enable_if 0>::type func(){
//不
}
生成的错误消息是:

error: expected unqualified-id before numeric constant
 typename std::enable_if<sizeof...(Ts) > 0u>::type func() {
                                         ^
错误:数字常量前应为非限定id
typename std::如果0u>,则启用:\u::type func(){
^

编译器需要使用括号才能正确解析:

template <class T, class... Ts>
typename std::enable_if<(sizeof...(Ts) > 0)>::type func() {
                        ^                 ^
  // nop
}
模板
typename std::enable_if 0)>::type func(){
^                 ^
//不
}

编译器将直角括号(
)解释为
std::enable_if
的结束括号。这是因为一旦开始模板参数(或参数)列表,编译器第一次有机会关闭它(使用
),它就会这样做

解决方案(这证明了上述观点):不要关闭参数列表,反转条件并使用左尖括号:

template <class T, class... Ts>
typename std::enable_if< 0 < sizeof...(Ts) >::type func() {}
//                         ^ compilers are cool with this
模板
typename std::enable_if<0::type func(){}
//^编译器对此很酷

你能解释一下吗?@Incubbus我在回答中解释了理由并给出了一个聪明的解决方案