[temp.variadic](作業草案)から、別のテンプレートクラスまたは関数の引数リストを定義しながら、パラメータパックを展開することができました。パラメータパックを展開し、引数リストを定義することはできますか?
は、次のクラスを考えてみましょう:
template<typename... T>
struct S {
template<T... I>
void m() {}
};
int main() {
S<int, char> s;
// ...
}
意図がキャプチャにテンプレートクラスS
を専門とメンバーメソッドの非型パラメータの引数リストを定義するためにそれらを使用するために使用さタイプですm
(T
は数種類に限られますが、これは質問の議論ではありません)。
この法的コードはありますか?私はそれを使用した方法でパラメータパックを使うことができますか、私は標準を誤解していますか(確かにそうだと確信しています)?
s.m<0, 'c'>()
:ここで、質問に詳細を追加するために
は、主要なコンパイラといくつかの実験からのいくつかの結果であるclang v3.9は、GCC v6.2それをコンパイルし、エラーを返しGCC v7。
s.m<0>();
:clang v3.9はエラーを返し、GCC v7はICEでコンパイルを停止しGCC v6.2、それをコンパイルします。s.m<>();
:clang v3.9,およびGCC v7エラーなしでコンパイルします。
少なくとも、コンパイラは私と同じように混乱しているようです。
はい、有効であり、空でもあります。https://stackoverflow.com/questions/32540178/what-can-you-do-with-templates-with-zero-template-parameters –
GCCは驚くほどあまり良くありませんvariadicテンプレートに関してはスマートです。 – DeiDei
@ JohannesSchaub-litb 's.m <0>();'は拒否されるべきですか?どちらのコンパイラにもエラーがありますか? – skypjack