這類似於question,但更具體的情況。這一次,沒有編譯器按預期工作。模板參數扣除參數類型的函數指針涉及非推斷參數包
template<class T>
struct nondeduced
{
using type = T;
};
template<class T>
using nondeduced_t = typename nondeduced<T>::type;
template<class... T, class U>
void f(void(*)(nondeduced_t<T>..., U)) {}
void g(int, char) { }
int main()
{
f<int>(g); // error?
}
在上面的例子中,參數包T
不能推斷出,但是編譯器應該能夠明確後參數代替包T
推斷U
(即單int
在這種情況下)。
上述預計沒有nondeduced_t
特技工作,以及:
template<class... T, class U>
void f(void(*)(T..., U)) {}
由於參數包T
根據 [temp.deduct.type]p5
非推斷已經處於非推導出上下文背景是:
- 函數paramete r包不會在參數聲明列表的末尾出現。
不幸的是,我沒有測試過編譯器(g ++/clang)接受代碼。 值得注意的是,下面的代碼可以在g ++ & clang上運行。
template<class... T>
void f(void(*)(nondeduced_t<T>..., char)) {}
再次,這並不在兩個工作:
template<class... T>
void f(void(*)(T..., char)) {}
是我的期望錯了嗎?
有人請幫助我在這裏學習一點。我會認爲'template void f(void(*)(nondeduced_t ...,U)){}'是不合格的,因爲可變參數包首先出現。 –
AndyG
來自cppreference的@AndyG:[在主類模板中,模板參數包必須是模板參數列表中的最後一個參數。在函數模板中,如果可以從函數參數中推導出所有以下參數,或者具有默認參數,那麼模板參數包可以出現在列表中較早的位置](http://en.cppreference.com/w/cpp/language/ parameter_pack) – jaggedSpire
看來,這並不是specccc –