Heim >Backend-Entwicklung >C++ >Warum kann ich keine nicht konstante Referenz an „std::async' übergeben und wie kann ich das umgehen?

Warum kann ich keine nicht konstante Referenz an „std::async' übergeben und wie kann ich das umgehen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-28 12:18:301001Durchsuche

Why can't I pass a non-const reference to `std::async` and how do I work around it?

Inkompatibilitäten bei der Argumentübergabe an std::async per Referenz

Die Unfähigkeit, eine nicht konstante Referenz als Argument an std zu übergeben: :async hat Entwickler verwirrt. Betrachten Sie das folgende Beispiel:

<code class="cpp">#include <functional>
#include <future>

void foo(int& value) {}

int main() {
    int value = 23;
    std::async(foo, value);
}</code>

Compiler melden einen Fehler mit diesem Code:

error: no type named ‘type’ in ‘class std::result_of<void (*)(int)>()’

Das Einschließen des Arguments in std::reference_wrapper löst das Problem, wirft jedoch Fragen zum zugrundeliegenden auf Mechanismus.

Begründung hinter der wertbasierten Argumentübergabe

Das Design von std::async geht absichtlich standardmäßig auf die Übergabe aller Argumente nach Wert ein. Diese Wahl gewährleistet Sicherheit, da Kopien von Argumenten nicht baumeln oder Rennbedingungen aufweisen können.

Adressierung nicht konstanter Referenzparameter

Es gibt jedoch Szenarien, in denen ein Argument übergeben wird durch nicht konstante Referenz ist erforderlich. Hier kommt std::ref ins Spiel. std::ref ermöglicht es Entwicklern, sich explizit für die riskante Semantik der Übergabe nicht konstanter Referenzen zu entscheiden und damit ihr Verständnis für die möglichen Konsequenzen anzuerkennen.

Das obige ist der detaillierte Inhalt vonWarum kann ich keine nicht konstante Referenz an „std::async' übergeben und wie kann ich das umgehen?. 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