让我们假设我有一个带有以下签名的函数:
void foo(std::function& bar);
以下调用成功编译:
foo([](int& x) { ++x; });
这也成功编译:
std::functionmyFunction = [](int& x) { ++x; }; foo(myFunction);
但是使用自动类型推导它突然无法编译:
auto myFunction = [](int& x) { ++x; }; foo(myFunction);
AFAIK推导出的lambda类型未指定,但它应该作为一个functor/callable.我不明白的是,std::function
如果不允许将同一个lambda 作为同一类型的函数参数传递,怎么可能将相同的lambda分配给a?
在GCC v4.8.5上测试,用-std=c++11
.
鉴于此案;
std::functionmyFunction = [](int& x) { ++x; }; foo(myFunction);
转换发生,结果存储在命名对象中myFunction
.反过来,命名对象可以绑定到所需的引用foo
.
鉴于另外两个案例;
foo([](int& x) { ++x; }); // and auto myFunction = [](int& x) { ++x; }; foo(myFunction);
可以进行从命名对象myFunction
(在第二种情况下)到std::function
(在两种情况下)的转换; 但是暂时产生了.临时无法绑定到std::function
所需的引用foo
,因此错误.添加const
如下允许代码编译;
void foo(std::functionconst& bar);
临时允许绑定const
参考.
示例代码.