右值引用绑定到 std::function 类型的左值

rvalue reference binding to an lvalue for std::function types

为什么下面代码(@)处没有编译错误?我认为 lamb 是左值,因此它不会绑定到右值引用。

using FunctionType = std::function<void()>;
using IntType = int;
struct Foo {
    void bar(FunctionType&&) {}
    void baz(IntType&&) {}
};

Foo foo;
foo.bar([]() {}); //OK
auto lamb = []() {};
foo.bar(lamb); //(@) No compilation error?!
foo.baz(5); //OK
int i = 5;
foo.baz(i); //Error

由于 lamb 是 lambda 而不是 std::function,因此必须创建临时 std::function 并将其传递给 bar()。临时绑定到右值引用。

您的代码等同于:

auto lamb = [](){};
foo.bar(FunctionType(lamb));

如果你这样做,你会得到一个编译错误:

FunctionType func = [](){};
foo.bar(func);