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!