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 )
Die Verwendung von std::bind
löst jedoch einen Compilerfehler aus: ( Live-Beispiel )
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?
Ich habe gelesen , dass
std::async
verwendet internstd::bind
, also wie kommt es dazu? Rvalue Referenzparameter, wennstd::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.
Tags und Links c++ lambda c++11 rvalue-reference stdbind