次のコードはコンパイルしてokを実行します。ファンクションテンプレートパラメータパックがパラメータリストの末尾にない
void foo() {
}
template <typename T, typename... Args>
void foo(T x, Args... args) {
cout << x << endl;
foo(args...);
}
// inside main()
foo(1,1,1);
この他のコードはコンパイルされません:
void foo() {
}
template <typename... Args, typename T>
void foo(Args... args, T x) {
foo(args...);
cout << x << endl;
}
// inside main()
foo(1,1,1);
コンパイラは、一致する関数がfoo(1,1,1)
への呼び出しのために存在しないことを言うと、foo(Args... args, T x)
が候補ですが、テンプレート引数控除/置換が失敗したことを言います候補者は1つの議論を期待しているが、3つは提供されているからだ。
この状況では、コンパイラが処理できない曖昧さはありますか?このコンパイルエラーはちょうど私に不合理なようです。たぶんこれはC++標準に合致していないのでしょうか?
これは単に "標準を正しく実装していないコンパイラ"の状況ですか? – matheuscscp
@matheuscscp、いいえ、標準でも許可されていません。 – chris
ありがとう! – matheuscscp