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&& forward(typename identity<_Ty>::type& _Arg) { return ((_Ty&&)_Arg); }</code>
Fall mit Template-Argument-Abzug
Wenn std::forward den Template-Argument-Abzug verwendet, würden die folgenden Szenarien auftreten:
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
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>
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!