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

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

Linda Hamilton
Linda HamiltonOriginal
2024-11-05 18:05:02412Durchsuche

Why is Template Argument Deduction Disabled in std::forward in Visual Studio 2010?

Abzug von Vorlagenargumenten in std::forward deaktivieren

Frage:

Warum ist Vorlage Argumentabzug in der Implementierung von std::forward in Visual Studio 2010 deaktiviert?

Antwort:

std::forward ist eine Dienstprogrammfunktion, die für die perfekte Weiterleitung verwendet wird Der Typ des Eingabearguments bleibt im Ausgabeargument erhalten. Wenn jedoch die Ableitung von Vorlagenargumenten in std::forward aktiviert wäre, könnte dies in bestimmten Szenarien zu falschem Verhalten führen.

Insbesondere, wenn das Eingabeargument ein L-Wert oder ein konstanter L-Wert ist (d. h. ein Objekt mit einem Namen). ), würde die Ableitung des Vorlagenarguments ableiten, dass der Parametertyp eine lvalue- oder const lvalue-Referenz ist. Im perfekten Weiterleitungsszenario ist dies nicht erwünscht, da das Ziel darin besteht, den genauen Typ des Eingabearguments beizubehalten.

Um das potenzielle Problem zu veranschaulichen:

<code class="cpp">template<typename T>
void test(T&& obj)
{
    // ...
}

int main()
{
    int x;
    int& y = x;

    test(7);       // input is an rvalue, so T is deduced as int&&
    test(x);       // input is an lvalue, so T is deduced as int&
    test(y);       // input is a named lvalue, so T is deduced as int&
}</code>

Hier Wenn std::forward beispielsweise die Vorlagenargumentableitung verwendet, wird der Typ des Arguments in test(x) und test(y) fälschlicherweise als int& abgeleitet, was zu unerwartetem Verhalten führt.

Um dieses Problem zu verhindern, Die Implementierung von std::forward verwendet die Identitätsmetafunktion, um den Typparameter explizit anzugeben, wodurch die Ableitung von Vorlagenargumenten effektiv deaktiviert wird. Dadurch wird sichergestellt, dass der Typ des Eingabearguments im Ausgabeargument erhalten bleibt, unabhängig davon, ob es sich um einen R-Wert oder einen L-Wert handelt.

Das obige ist der detaillierte Inhalt vonWarum ist die Ableitung von Vorlagenargumenten in std::forward in Visual Studio 2010 deaktiviert?. 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