Unterschied zwischen std :: async und std :: bind beim Umschließen von rvalue reference lambda

8

Inspiriert von diesem Kommentar über lambdas mit rvalue-Referenzparametern direkt an std::async binden, einen rvalue an ein Lambda binden, indem std::async kompiliert und wie erwartet ausgeführt wird: ( Live-Beispiel )

%Vor%

Die Verwendung von std::bind löst jedoch einen Compilerfehler aus: ( Live-Beispiel )

%Vor%

Dies liegt daran, dass std::bind message als lvalue enthält, so dass das Argument beim Übergeben an das Lambda nicht mehr mit dem Parameter übereinstimmt.

Ich habe gelesen , dass std::async intern std::bind verwendet, also wie kommt es mit der rvalue-Referenz her? Parameter, wenn std::bind nicht? Gibt es einen bestimmten Teil des Standards, der dieses Verhalten erfordert oder vom Compiler abhängig ist?

    
huu 06.05.2015, 19:29
quelle

1 Antwort

4
  

Ich habe gelesen , dass    std::async verwendet intern std::bind , also wie kommt es dazu?   Rvalue Referenzparameter, wenn std::bind nicht?

Es verwendet intern bind nicht. (Oder vielmehr, es könnte nicht ohne einige epische Verrenkungen, wie die in @ Praetorian Antwort in dieser Frage , und gehen es ist viel einfacher, einfach etwas separat zu schreiben).

Es wird normalerweise mit einer etwas bind -ähnlichen Maschinerie implementiert, aber es ist viel einfacher, weil es nicht alle Arten von seltsamen Dingen behandeln muss bind handles (verschachtelte bind s, Platzhalter, zusätzliche Argumente wegfallen lassen) usw.).

  

Gibt es einen bestimmten Teil des Standards, der dieses Verhalten erfordert?   oder hängt das vom Compiler ab?

Es wird vom Standard verlangt. Die Angabe von bind ist lächerlich dicht, erfordert aber, dass gebundene Argumente als lvalues ​​([func.bind.bind] / p10, bullet 4) übergeben werden.

async wird angegeben, um INVOKE (DECAY_COPY (std::forward<F>(f)), DECAY_COPY (std::forward<Args>(args))...) aufzurufen, und DECAY_COPY gibt immer einen rvalue zurück.

    
T.C. 06.05.2015, 20:08
quelle