当前位置:  开发笔记 > 编程语言 > 正文

自动类型推导并将lambda传递给std :: function参数

如何解决《自动类型推导并将lambda传递给std::function参数》经验,为你挑选了1个好方法。

让我们假设我有一个带有以下签名的函数:

void foo(std::function& bar);

以下调用成功编译:

foo([](int& x) { ++x; });

这也成功编译:

std::function myFunction = [](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.



1> Niall..:

鉴于此案;

std::function myFunction = [](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::function const& bar);

临时允许绑定const参考.

示例代码.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有