Heim  >  Artikel  >  Backend-Entwicklung  >  Warum deaktiviert „std::forward“ die Ableitung von Vorlagenargumenten in Visual Studio 2010?

Warum deaktiviert „std::forward“ die Ableitung von Vorlagenargumenten in Visual Studio 2010?

Barbara Streisand
Barbara StreisandOriginal
2024-11-05 17:45:02507Durchsuche

Why does `std::forward` disable template argument deduction in Visual Studio 2010?

Deaktivieren der Vorlagenargumentableitung in std::forward

Problembeschreibung

Visual Studio 2010 definiert std::forward zu Deaktivieren Sie den Abzug von Vorlagenargumenten. Warum ist diese Deaktivierung beabsichtigt?

Antwort

Der Abzug von Vorlagenargumenten würde zu einer falschen Typbestimmung und falschem Verhalten in std::forward führen. So geht's:

Fall ohne Vorlagenargumentabzug

Ohne Vorlagenargumentabzug ist std::forward definiert als:

<code class="cpp">template<class _Ty> inline
_Ty&amp;&amp; forward(typename identity<_Ty>::type&amp; _Arg) {
    return ((_Ty&amp;&amp;)_Arg);
}</code>

Fall mit Template-Argument-Abzug

Wenn std::forward den Template-Argument-Abzug verwendet, würden die folgenden Szenarien auftreten:

  • Für eine R-Wert-Referenz auf ein Objekt vom Typ X (z. B. func() oder 7) würde die Ableitung von Vorlagenargumenten T korrekt als Referenz oder konstante L-Wert-Referenz.
Auswirkungen einer falschen Typbestimmung

Bei der perfekten Weiterleitung ist das an std::forward übergebene Argument ein L-Wert. Wenn die Ableitung von Vorlagenargumenten aktiviert wäre, wäre der abgeleitete Typ T eine L-Wert-Referenz. „Perfekte Weiterleitung“ impliziert jedoch eine R-Wert-Referenz.

Die Umwandlung in std::forward, static_cast(arg), würde immer auf eine L-Wert-Referenz reduziert, selbst wenn das ursprüngliche Argument ein R-Wert war. Dies würde zu einer falschen Umwandlung und Fehlfunktion des perfekten Weiterleitungsmechanismus führen.

Beispiel

Der folgende Code veranschaulicht die Probleme bei der Ableitung von Vorlagenargumenten:

<code class="cpp">template<typename T>
T&& forward_with_deduction(T&& obj) {
    return static_cast<T&&>(obj);
}

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

    forward_with_deduction(7); // Correctly calls forward(int&&)
    forward_with_deduction(y); // Incorrectly calls forward(int&)

    std::forward<int&>(y); // Correctly calls forward(int&)
}</code>
Fazit

Das Deaktivieren der Vorlagenargumentableitung in std::forward ist entscheidend für die ordnungsgemäße Funktion der perfekten Weiterleitung. Es verhindert eine fehlerhafte Typbestimmung und stellt sicher, dass R-Wert-Referenzen korrekt als R-Wert-Referenzen weitergeleitet werden.

Das obige ist der detaillierte Inhalt vonWarum deaktiviert „std::forward“ die Ableitung von Vorlagenargumenten in Visual Studio 2010?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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