次のコード:可変長引数を使って部分的な特殊で打ち鳴らす行動対GCCプラス同じ種類の追加の引数
:#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>
は両方のコンパイラ(テンプレート引数が間違っている)でコンパイルできないため、実際には特殊化は危険です。
'<0, int>は'、あなたが最初のテンプレートを変更する必要ができるようにします。それは専門化のためには遅すぎる。 – Jarod42
@ Jarod42はい、私はテンプレートのインスタンス化が間違っていることを知っています。私は 'T ... args'だけ' g ++ 'ではエラーを発生させ、' clang'ではエラーを発生させない部分的な特殊化について尋ねています。それはより明白です)。 – Holt
GCCが正しいです。これは[DR 1495](http://wg21.link/cwg1495)(GCCの管理者によって報告されているのでやや意外である)によれば、不正な形式です。 –