Sie einen Lambda auf einen std::function &
vorbei. Ein Lambda ist kein std::function
also funktioniert das nicht direkt. Ein Lambda ist jedoch in eine std::function
umwandelbar, so dass eine temporäre std::function
erstellt werden muss, die das Lambda hält.
Da Sie ein std::function &
nehmen C++ nimmt an, dass Sie diesen Wert ändern möchten, sonst würde es keinen Sinn machen, es durch nicht-const Referenz zu nehmen. Das Ändern eines Temporären hat keine Auswirkung, daher ist dies nicht sinnvoll, daher erlaubt C++ das nicht.
Eine Möglichkeit, das Problem zu beheben, ist eine const std::function &
. Auf diese Weise gibt es keine Änderung eines temporären.
Eine andere Möglichkeit besteht darin, eine tatsächliche std::function
zu übergeben, die Sie in main
erstellen.
Eine andere Möglichkeit ist es, eine Vorlage zu erstellen, die es Argument an die std::function
nur weiterleitet:
class MyClass
{
public:
template <class T>
MyClass(T &&t)
: fun(std::forward<T>(t)){}
private:
std::function<int(int, int)> fun;
};
auf diese Weise MyClass
etwas nimmt und verwendet es fun
zu konstruieren. Beachten Sie, dass fun
keine Referenz mehr ist. Die std::function
muss irgendwo leben und da es Teil von MyClass
ist, macht es Sinn, die Lebensdauer der std::function
an MyClass
zu binden.
Wenn Sie wirklich wollen, dass fun
eine Referenz sein soll, müssen Sie einen Platz dafür finden und sicherstellen, dass es dort bleibt, bis MyClass a;
zerstört wird. Ich empfehle diesen Weg nicht, da es immer schwieriger wird, sicherzustellen, dass die Lebensdauern korrekt sind.
Sie können das Lambda auch direkt speichern, aber das ist ein bisschen schwierig und abhängig davon, was Sie eigentlich mit MyClass
tun möchten, kann es nicht lebensfähig sein.
Fehler wie? Mach ein [mcve]. – nwp
Warum müssen Sie eine Nicht-'const'-Referenz * an eine 'std :: -Funktion übergeben? –
@nwp: Fehler in der Art, dass das Übergeben eines prvalue an eine Funktion, die eine Nicht-const-Referenz verwendet, fehlschlägt. –