右值引用绑定到 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);
为什么下面代码(@)
处没有编译错误?我认为 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);