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