は、次の最小限の例を考えてみましょう:最後のテンプレートパラメータではない減点とパラメータパック:この有効なコードは?
template<typename... A, typename R>
void f(A&&..., R(*)(A...)) {}
void g(int, char) {}
int main() {
f<int, char>(42, 'c', g);
}
パラメータパックA
は最後のパラメータではありません。
とにかく、私はR
が[temp.param]/11のために関数ポインタから推測されたと考えました。この上
GCC(6.2)agrees with me
、打ち鳴らすしばらく(3.9) rejects the codeとは、それが テンプレート引数R
を推測することができなかったと述べています。
私の期待は間違っていたので、GCCはそれを受け入れるべきではない、あるいはclangの問題ですか?その言及した段落から
プロトタイプが 'R(*)(A ...)、A && ...'のときはどうなりますか?私は 'clang'が正しいと思う。なぜなら、引数パックが関数ポインタを飲み込んで、' R'を推測しないからです。 – StoryTeller
@StoryTeller良い点。どちらのコンパイラもコードを受け入れます。とにかくそれはまったく同じではありません。関数ポインタを動かすと ''が削除され、 'f(g、42、 'c')'として 'f'が呼び出されます。 –
skypjack
私はそれが問題であるかどうかはわかりません。可能であればGCCの強化だけです。 – StoryTeller