2014-05-01 62 views
6

gcc-4.8接受此代碼,但是它沒有錯,因爲非類型參數包相當於void...這是非法的嗎?是不是非類型參數包,評估爲「void ...」非法?

template <typename T, 
      typename std::enable_if<std::is_integral<T>::value>::type...> 
void test(T) {} 

我試過這與ng 3.5,以及它也接受它。這是一個編譯器錯誤,還是我誤解了一些東西?


下面的完整測試代碼,它使用非類型的空參數包來簡化enable_if。 這與Flaming Dangerzone's Remastered enable_if中的內容幾乎相同,除非替換後包變爲void...

#include <type_traits> 

template < typename C > 
using enable_if = typename std::enable_if<C::value>::type ; 

template < typename T, enable_if<std::is_integral<T>>... > 
void test(T){} // #1 

template < typename T, enable_if<std::is_floating_point<T>>... > 
void test(T){} //#2 

int main() 
{ 
    test(0); // calls #1 
    test(0.0); // calls #2 
    return 0; 
} 

gcc-4.8很好的編譯上面的代碼。鏗鏘聲不會,但這是因爲它有一個不同的錯誤http://llvm.org/bugs/show_bug.cgi?id=11723

+1

我認爲這是非法的。參見該標準的段落[temp.param] 14.1/7:「非類型模板參數不應被聲明爲具有浮點,類或空類型。」 – Constructor

+0

您應該提供自包含的代碼。我只能說所寫的代碼不能編譯,因爲缺少include和缺少main。 –

+2

@ JohannesSchaub-litb請參閱[一個簡單的例子](http://ideone.com/hxuKmJ),它重現了這個問題。 – Constructor

回答

3

你提供不使感,因爲你不能沒有未膨脹參數包一包擴展兩個代碼段: §14.5.3/ 5:

一包膨脹的模式應命名一個或多個未通過嵌套包擴展擴展的參數包;這種參數包稱爲未擴展的模式中的參數包。

回到實際的問題: 如果實際使用適當的包擴展和你實例化的組件擴展與非空參數組,在§14.1/ 7條適用的規則,因爲很明顯,非A型模板參數不能聲明爲void類型。

只要該包擴展沒有用非空參數包實例化,就不會違反規則,因爲沒有參數聲明已完成。 :)

相關問題