2017-12-18 5 views
9

는 최근이 같은 코드에 문제가 있었다 :const를 추가하지 않으면 왜 컴파일러에서 자동 템플릿 매개 변수를 추론 할 수 없습니까?

constexpr auto lambda = []{}; 

template<auto& l> 
struct Lambda {}; 

template<auto& l> 
void test(Lambda<l>) {} 

int main() { 
    test(Lambda<lambda>{}); 
} 

연타 모두를하고 l을 추론 할 수없는 GCC는 말한다. 내가 거기에 const를 추가하면

그러나 :

// ----v 
template<const auto& l> 
void test(Lambda<l>) {} 

그런 다음 모든 연타와 함께 작동합니다. GCC는 여전히 실패합니다. 여기 무슨 일 이니? const 그 자체를 추론 할 수 있습니까? 두 경우 모두 l을 추론하지 않는 GCC 버그입니까?

답변

8

이 두 경우 모두에서 내가 추측하지 못하는 GCC 버그입니까?

버그이며 Clang도 마찬가지입니다. 자리 표시 자 형식이 아닌 형식 인수의 경우, [temp.arg.nontype]/1는 말한다 : 템플릿 - 매개 변수의 유형이 자리 유형이 포함

경우, 추론 매개 변수 유형은 자리로 템플릿 인수의 유형에서 결정된다 유형 공제. 템플릿 형식 매개 변수 선언 ([temp.param])에 대해 추론 된 매개 변수 형식을 사용할 수 없으면 프로그램이 잘못 구성됩니다.

l가 CONST 기준이다

int main() { 
    auto& l = lambda; 
} 

것은 여기에서 추론하는 것이 매우 동일한 방법.

관련 문제