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
Freigeben: 2024-10-28 12:18:30
Original
1002 Leute haben es durchsucht

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>
Nach dem Login kopieren

Compiler melden einen Fehler mit diesem Code:

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

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!

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