为什么(@)
在以下代码中没有汇编错误?我以为lamb
是一个LVALUE,因此它不会绑定到RVALUE参考。
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()
。临时与RVALUE参考结合。
您的代码等效于此:
auto lamb = [](){};
foo.bar(FunctionType(lamb));
,如果您这样做,您将遇到编译错误:
FunctionType func = [](){};
foo.bar(func);