2017-03-12 8 views
0

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); 
} 
+0

이러한 규칙이 규칙인지 또는 규칙 인 지 묻는 중입니까? – ildjarn

+0

'gcc'는 컴파일하지 않기 때문에 규칙이 될 것으로 기대합니다. 이것이 왜 그렇게 중요한지를 알 수 없기 때문에 그 이유를 듣고 기뻐할 것입니다. 물론 그것을 피할 수있는 방법을보고 싶습니다. (; – Jonas

+0

@Jonas 다른 컴파일러와 마찬가지로 같은 방식으로 실패합니다. –

답변

1

할 수없는 이유는 내 gcc-5.4.0하지가 함수의 인수 목록의 마지막에 표시되지 않는 경우 매개 변수 팩을 추론?

당신은 그쪽으로 개방 할 필요가 그것은 단지 기본 매개 변수 값, 또는 일반 줄임표 (...)와 같은 문제의 그

void fails (args_...args, int last) 
         // ^^^^^^^^^^ 

같은 가변 매개 변수 팩을 넘어 어떤 유형을 지정할 수 없기 때문에 매개 변수 목록의 끝 (또는 요소가 마지막 요소 여야 함) :

void fails(int x = 0, int last); 
void fails(int x, ..., int last);