Heim > Backend-Entwicklung > C++ > Warum verwendet std::forward die Identitätsvorlage, um den Abzug von Vorlagenargumenten zu deaktivieren?

Warum verwendet std::forward die Identitätsvorlage, um den Abzug von Vorlagenargumenten zu deaktivieren?

Susan Sarandon
Freigeben: 2024-11-09 09:34:02
Original
682 Leute haben es durchsucht

Why does std::forward use the identity template to disable template argument deduction?

Deaktivieren der Vorlagenargumentableitung mit std::forward, um eine korrekte Weiterleitung sicherzustellen

Bedenken Sie die Definition von std::forward in VS2010:

<code class="cpp">template<class _Ty> inline
_Ty&amp;&amp; forward(typename identity<_Ty>::type&amp; _Arg)
{   // forward _Arg, given explicitly specified type parameter
    return ((_Ty&amp;&amp;)_Arg);
}</code>
Nach dem Login kopieren

Der Zweck der Identitätsvorlage besteht darin, die Ableitung von Vorlagenargumenten zu deaktivieren. Warum ist dies in diesem Szenario von entscheidender Bedeutung?

Der Abzug von Vorlagenargumenten würde zu einem falschen Typabzug führen. Wenn ein R-Wert-Verweis auf ein Objekt vom Typ Für eine perfekte Weiterleitung ist der Parameter jedoch ein L-Wert, da er einen Namen hat. Daher würde die Verwendung der Vorlagenargumentableitung in std::forward dazu führen, dass der abgeleitete Parametertyp eine L-Wert-Referenz oder eine konstante L-Wert-Referenz ist.

<code class="cpp">template<typename T>
T&amp;&amp; forward_with_deduction(T&amp;&amp; obj)
{
    return static_cast<T&amp;&amp;>(obj);
}</code>
Nach dem Login kopieren

Betrachten Sie das folgende Beispiel:

<code class="cpp">void test(int&amp;){}
void test(const int&amp;){}
void test(int&amp;&amp;){}

template<typename T>
void perfect_forwarder(T&amp;&amp; obj)
{
    test(forward_with_deduction(obj));
}

int main()
{
    int x;
    const int&amp; y(x);
    int&amp;&amp; z = std::move(x);

    test(forward_with_deduction(7));    //  7 is an int&amp;&amp;, correctly calls test(int&amp;&amp;)
    test(forward_with_deduction(z));    //  z is treated as an int&amp;, calls test(int&amp;)

    //  All the below call test(int&amp;) or test(const int&amp;) because in perfect_forwarder 'obj' is treated as
    //  an int&amp; or const int&amp; (because it is named) so T in forward_with_deduction is deduced as int&amp; 
    //  or const int&amp;. The T&amp;&amp; in static_cast<T&amp;&amp;>(obj) then collapses to int&amp; or const int&amp; - which is not what 
    //  we want in the bottom two cases.
    perfect_forwarder(x);           
    perfect_forwarder(y);           
    perfect_forwarder(std::move(x));
    perfect_forwarder(std::move(y));
}</code>
Nach dem Login kopieren

In diesem Beispiel schlägt die perfekte Weiterleitung fehl, da der Parameter in perfect_forwarder aufgrund seines Namens als Lvalue- oder Const-Lvalue-Referenz behandelt wird. Dies führt zu einer falschen Typableitung in „forward_with_deduction“, was zu einer unerwünschten static_cast-Semantik führt.

Das Deaktivieren der Vorlagenargumentableitung mit der Identitätsvorlage in „std::forward“ stellt sicher, dass „std::forward“ immer eine R-Wert-Referenz zurückgibt, was für wichtig ist Korrekte, perfekte Weiterleitung von L-Werten und R-Werten.

Das obige ist der detaillierte Inhalt vonWarum verwendet std::forward die Identitätsvorlage, um den Abzug von Vorlagenargumenten zu deaktivieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage