Ich fand heraus, dass lvalue
Lambda-Verschlüsse immer als rvalue
Funktionsparameter übergeben werden können.
Siehe die folgende einfache Demonstration.
#include <iostream>
#include <functional>
using namespace std;
void foo(std::function<void()>&& t)
{
}
int main()
{
// Case 1: passing a `lvalue` closure
auto fn1 = []{};
foo(fn1); // works
// Case 2: passing a `lvalue` function object
std::function<void()> fn2 = []{};
foo(fn2); // compile error
return 0;
}
Fall 2 ist das Standardverhalten (ich habe a nur std::function
zu Demonstrationszwecken verwendet, aber jeder andere Typ würde sich gleich verhalten).
Wie und warum funktioniert Fall 1? Wie ist der fn1
Schließzustand nach der Rückgabe der Funktion?
std::function
aus einem Lambda abgeleitet werden?" Ihr Programm versucht nicht, die Vorlagenargumente von abzuleiten std::function
, daher gibt es kein Problem mit der impliziten Konvertierung.
std::function
hat einen nicht expliziten Konstruktor, der Lambda-Abschlüsse akzeptiert, sodass eine implizite Konvertierung erfolgt. Unter den Umständen der verknüpften Frage kann die Instanziierung der Vorlage von std::function
jedoch nicht aus dem Lambda-Typ abgeleitet werden. (Zum Beispiel std::function<void()>
kann aus konstruiert werden [](){return 5;}
, obwohl es einen nicht leeren Rückgabetyp hat.
fn1
implizit in einstd::function
In konvertiert wirdfoo(fn1)
. Diese temporäre Funktion ist dann ein Wert.