gcc-5.4.0
は、関数の引数リストの最後に表示されない場合、パラメータパックを推論できないのはなぜですか? works
へのコールはworks<int,int,int>
に正しく導かれますが、fails
へのコールは推測されませんが、空のパラメータパックのみが使用されます。関数の提供された引数が多すぎるというエラーメッセージが表示されます。控除対象外のパラメータパック
#include <iostream>
template <typename...args_t>
void works (int first, args_t...args) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
template <typename...args_t, typename last_t, typename=void>
void fails (args_t...args, last_t last) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main() {
works (0, 1, 2, 3);
fails (0, 1, 2, 3);
return 0;
}
編集:答えは説明したように、パラメータパックの後に型名を持つことが許されていません。しかし、cppreference.comによれば、それが演繹される可能性がある場合は、後に他のテンプレートパラメータを持つことが有効である必要があります。明らかに、与えられた例は私のgcc
でコンパイルされません。代わりに、あまりにも多くの与えられた引数について同じエラーが残っています。
#include <iostream>
template <typename...args_t, typename U, typename=void>
static int valid (args_t...args, U u) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return u;
}
int main() {
return valid(0, 0.0, -1, 3u);
}
これらはルールであるか、それともルールであるかを尋ねていますか? – ildjarn
は 'gcc'でコンパイルしていないので、ルールであると考えています。なぜこれがそうであるかについて私が何かを見つけることができなかったので、私はそれの理由を聞いてうれしいです。もちろん、私はそれを迂回する方法も見たいと思います。(; – Jonas
@Jonas他のコンパイラと同じように失敗します。 –