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;
}
편집 : 답변 설명으로,이 매개 변수 팩 후 typenames을 할 수 없습니다. 그러나 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 다른 컴파일러와 마찬가지로 같은 방식으로 실패합니다. –