那麼,你基本上是要求編譯器爲你解決方程2 * m == 2
,以確定模板參數m
爲match
。編譯器在模板參數推導期間不解決方程式,無論它們是多麼簡單和毫不含糊。
在14.8.2.4/14的語言規範(C++ 03),14.8.2.5/16(C++ 11)涉及您的情況,並有類似的例子
如果,在與非型 模板參數,所述非類型模板參數是在函數參數列表中的 表達式中使用的,對應 模板參數必須在功能模板的聲明始終明確指定或在其他地方推導出 ,因爲類型扣除總是會失敗,例如 a 模板參數。
template<int i> class A { /* ... */ };
template<short s> void g(A<s+1>);
void k() {
A<1> a;
g(a); //error: deduction fails for expression s+1
g<0>(a); //OK
}
至於爲什麼它那麼做......我認爲這是很明顯的,在一般情況下,解決一個數學公式的問題太複雜了。它也可能導致模糊的解決方案或不屬於預期域的解決方案。例如,您希望編譯器推導出什麼樣的match(num<3>())
?
來源
2012-11-28 02:21:46
AnT
不幸的是,最新的草案在這裏http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf甚至在這裏https://github.com/cplusplus/draft似乎沒有該款。但我聽你的話:) – keveman
@keveman:我從C++ 03複製它。在C++ 11中,等價的部分是14.8.2.5/16 – AnT
是的,明白了,謝謝。 – keveman