2014-03-04 5 views
7

이 다음 코드를 사용하여 재생할 수 있습니다 function template does not recognize lvalue이해 템플릿 인수 공제

에서 후속이다 두 번째 전화에서 무슨 일이 일어나고 있는지. 어떻게 컴파일러 템플릿 매개 변수를 해결? 왜 애매 모호하지 않습니까?

+5

표준에서 14.8.2를 문의하십시오. 템플릿 인수 공제는 다소 복잡한 주제입니다. 요점은 "최상의 일치"가 선택되고, "T"가 참조 유형으로 추론 될 수 있다는 것입니다. –

+0

"다소 복잡한 주제"! 난 전적으로 동의합니다. 그건 그렇고, g ++/clang ++에게 여기에서하는 일에 대해 장황하게 요구하는 방법이 있습니까? – hivert

+0

무고한 하위 섹션은 15 페이지를 차지하며 완전히 새로운 수학 표기법을 개발합니다. -S하지만 궁극적으로 "생각하는대로"하면 함수 매개 변수의 컨텍스트에서 템플릿 매개 변수를 정직한 형식으로 받아 들여야합니다. –

답변

13

func<double>(n)이라고 말하면 사용자가 인수를 지정하므로 인수 공제가 없으므로 선택 사항은 func(double &&)func(const double &) 사이입니다. rvalue 참조가 lvalue (즉, n)에 바인딩 될 수 없기 때문에 전자는 실행 가능하지 않습니다.

func(n) 만 인수 공제를 수행합니다. 이것은 복잡한 주제이지만, 간단히 말해서, 당신은이 두 가지 후보 : 원함 (즉 double에서 const double에) 인수 값 중 하나 적은 변환을 필요로하기 때문에

T = double &: func(T &&)  --> func(double &)   (first overload) 
T = double:  func(const T &) --> func(const double &) (second overload) 

첫 번째 과부하가 엄격하게 더 나은입니다.

마법 성분 T 자체 참조 형식 인 경우 T &&가 좌변 참조 될 수 있다는 것을 의미 "reference collapsing"이다 (specificaly, double & &&double &가되고, 즉, 제 공제가 존재할 수 있음).

+0

Herb Sutter의 기사 [왜 특수 기능 템플릿이 아닌가?] (http://www.gotw.ca/publications/mill17.htm)도이 동작을 이해하는 데 도움이됩니다. – piwi

+3

@ piwi rvalue reference가 도입 된 이후로 절망적 인 것은 예외입니다. @Kerrek은 템플릿 인수 공제가 이루어질 때'func (T &&')의'&&'는 ** rvalue reference가 아니라 범용 참조인데, rvalue 참조 (인수가 rvalue 인 경우) 또는 lvalue 참조 (인수가 lvalue 인 경우). Scott Meyer는 http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers에서이 점을 잘 설명합니다. 이 특정 질문에 대해 권하고 싶은 기사입니다. –

+0

@JamesKanze 나는 문맥에 따라'&&'의 두 가지 의미를 알고있다. 그러나 Herb Sutter의 기사는 이것을 다루지 않는다. 그러나 템플릿과 오버로드를 "혼합"할 때 해상도 규칙을 이해하는 것이 유용하다는 것을 알았습니다. 링크 주셔서 감사합니다! – piwi