明示的なテンプレート引数リストと [temp.arg.explicit]/3 を使用した関数呼び出しの推定失敗

質問に関連するのは [temp.arg.explicit]/6 であり、関数パラメーターの暗黙的な変換 (上記のように) が

であることを示しています

では、問題は A... かどうかです。 テンプレートの実引数推定に参加します。 (この時点で、明示的に指定されているため、パラメーターパックを1つのテンプレートパラメーターで置き換えると、OPコードがgcc/clangでもコンパイルされることに注意してください)。

A... と主張することができます 明示的に指定されているため、控除には参加しません。しかし、私はどちらかが間違っていると主張します。 [temp.arg.explicit]/9 は、演繹が明示的に指定されたテンプレート引数リストを拡張できることを示しています。したがって、f<int>(S<int, char>{0}); 有効で A... int, char と推定されます .この場合 A... 間違いなく控除に参加します。しかし、この呼び出しはパラメーターによる呼び出しとのみ異なるため、呼び出しでも控除を行う必要があります。

つまり f<int>(0); f<int, char> を呼び出すこともできます そのため、単一の関数テンプレート仕様を指定していません。


それは無関係です。 「オーバーロード解決なし」の関数呼び出しなどはありません。 CWG2092 はこれを明確にしています。

[temp.over]/1 コントロール (読みやすくするために分割; 強調):