2014-11-09 3 views
1

내가이 구조체가 있다고? IMO, 그들은해야하지만, 나는 단지 확신을 요구하고있다.완벽한 전달 딜레마

편집 : 이 질문에 대한 이유는 완벽하게 전달 함수가 항상 템플릿 함수가되어야하는 방법에 대한 일반적인 강의입니다. 분명히 이것은 f에 해당하지 않습니다.

+1

당신이 * 것 둘 다 앞으로 완벽하게 * 무슨 뜻인지에 따라 다릅니다. 'f()'는 rvalue 참조를 인수로 받아들이며, rvalues를 따라'fwd()'에 전달합니다. 'g()'는 lvalue와 rvalue 참조를 모두 받아 들여 각각의 값 범주를 유지하면서 그들을 전달합니다. – Praetorian

+3

@Praetorian : 왜 rvalue-references입니까? 우리는'A'의 인스턴스화가 어떻게 사용되었는지 알지 못합니다. 'A ''A ''Aint const &>'A '... – Deduplicator

+0

공제 규칙으로 인해 무슨 말을하는지, 명시 적으로 인스턴스화하면 어떨까요? 즉, 참조 유형 매개 변수로 'A'를 인스턴스화 할 수 있습니다. – user1095108

답변

2

fg은 모두 앞쪽에 완벽하게 표시됩니다. A... == B...?

예. 나는 그들이해서는 안되는 어떤 이유도 볼 수 없다.

+0

위의 설명에서 볼 수 있듯이 때로는 혼란이 있습니다. – user1095108

1

예, A... == B... 인 경우 동작에는 차이가 없습니다. 그러나 템플릿 기능이 필요한 전달 함수에 대한 일반적인 조언이 필요한 이유는 올바른 유형을 지정하는 대신 (함수 템플릿의 경우와 같이) 컴파일러에서 유형을 추론해야한다는 것입니다 클래스 템플릿의). 이러한 차이는 유형 X (물론, 그들이 A... == B...을 만족하지 않는)에 대한 다음 코드에 의해 설명된다

X x; 
A<X>::f(X()); 
A<X>::g(X());//here, f and g have the same behaviour 

A<X>::f(x);//fails to compile, since A<X>::f expects an rvalue ref. 
A<X>::g(x);//works as expected - Here, B... = X&, while A... = X. 

A<const X&>::f(X());//oh noes! fwd gets a const X&. 
A<const X&>::g(X());//forwards correctly as B... = X, even though A... = const X&.