2016-05-24 7 views

Odpowiedz

6

S w wyrażeniu typename std::remove_reference<S>::type jest zakaz wywnioskować kontekst (w szczególności z powodu S pojawia się w nested-NAME specyfikatorem Urządzony typ określony przy użyciu kwalifikowanego identyfikatora ). Niepodjęte konteksty są, jak sama nazwa wskazuje, kontekstami, w których nie można wywnioskować argumentu szablonu.

Ta sprawa stanowi łatwy przykład, aby zrozumieć, dlaczego. Powiedz, że miałem:

int i; 
forward(i); 

Co by było S? Może to być jeden z tych typów, który dałby poprawny typ argumentu dla funkcji. Po prostu niemożliwe jest, aby kompilator określił , który naprawdę masz na myśli - więc nie próbuje. To nie wywnioskować, więc trzeba wyraźnie, jaka S chodziło Ci o:

forward<int&>(i); // oh, got it, you meant S=int& 
+0

"Mogłem mieć zupełnie niepowiązany typ' Foo', dla którego specjalizuję 'remove_reference ', aby mieć typ 'int'." To technicznie UB :) –

+0

@ T.C. Ok, usunę tę część. Nie chciałbym szerzyć złych pomysłów! – Barry

+0

Polecam przeprofilowanie "ponieważ S jest specyfikatorem nazwy zagnieżdżonej" na coś podobnego "ponieważ S pojawia się w specyfikatorze nazwy zagnieżdżonej" –

-4

ten sposób remove_reference jest realizowany:

template< class T > struct remove_reference  {typedef T type;}; 
template< class T > struct remove_reference<T&> {typedef T type;}; 
template< class T > struct remove_reference<T&&> {typedef T type;}; 
+0

Ale dlaczego z tego powodu zostanie zapewnione, że szablon argumentu nie należy wywnioskować? – Kapil

+0

Pytanie nie brzmi "w jaki sposób zaimplementowano" remove_reference "? – Barry

+0

@ Barry podana definicja "remove_reference", można zobaczyć, jak wyłącza odliczanie argumentów szablonu. To jest najdokładniejsza odpowiedź. –

Powiązane problemy