2011-11-16 22 views
4

我試圖沿着這條使用GCC 4.7快照的線路做一些事情:是否允許在模板參數中使用sizeof ...來進行專門化?

template <int n, int... xs> 
struct foo { 
    static const int value = 0; 
}; 

// partial specialization where n is number of ints in xs: 

template <int... xs> 
struct foo<sizeof...(xs), xs...> { // error: template argument ‘sizeof (xs ...)’ 
            // involves template parameter(s) 
    static const int value = 1; 
}; 

template <int... xs> 
struct foo<sizeof(xs), xs...> { // This compiles fine. sizeof(xs) is sizeof int 
           // even though packs aren't expanded 
    static const int value = 2; 
}; 

錯誤很奇怪,因爲的sizeof代替的sizeof ......在這種情況下工作。兩者似乎都可以在編譯期間輕鬆計算。

編譯器是否正確,我不能在模板參數中使用sizeof...進行專業化?

+0

你的意思是'sizeof(xs)'的作品?我希望對未擴展的包進行投訴。 –

+0

@ R.MartinhoFernandes奇怪的是它確實有效。 – Pubby

+0

同樣的錯誤,更簡單的代碼:http://ideone.com/BBKbw。第二個可能是編譯器中的錯誤,或者只是'sizeof(xs)== sizeof(int)',因此不涉及模板參數。 - 作爲一種實際的解決方案:'value = sizeof ...(xs)== n;'? – UncleBens

回答

3

在閱讀this post後,我將假設這是一個編譯器問題。

除非參數表達式是簡單標識符,否則部分專用非類型參數表達式不應涉及部分特化的模板參數。

有爭議點here

GCC要麼不正確地拆開參數包的包裝,要麼過早地評估sizeof

Response to bug report I filed may be helpful.