下面的代碼:GCC VS與可變參數加上相同類型的額外參數偏特鐺行爲
#include <cstddef>
template <size_t N,
typename T,
T first,
T... rest>
struct A {
};
template<typename T,
T... args>
struct A<0, T, args...> {
};
int main() {
A<0, int, 1> a0;
A<2, int, 1, 2> a2;
return 0;
}
...不g++
(5.1.0
版本和5.3.0
)編譯由於:
error: partial specialization is not more specialized than the primary template because it replaces multiple parameters with a pack expansion
...但是編譯clang
。
是否允許聲明這種部分專業化?
附註:事實上,專業化是危險的,因爲A<0, int>
無法與編譯器(模板參數錯誤編譯)編譯。
要允許'A <0, int>',你必須改變第一個模板。專業化爲時已晚。 – Jarod42
@ Jarod42是的,我知道模板的這種實例化是錯誤的,我只是在'g ++'中引發錯誤,而不是'clang'的T ... args'部分專業化問題(重新組織問題以使它更清晰)。 – Holt
GCC是對的。根據[DR 1495](http://wg21.link/cwg1495),這是不合格的(有點不令人驚訝,因爲它是由GCC的維護者報告的)。 –