gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:49:25 24 4
gpt4 key购买 nike

假设我有一个具有以下签名的函数:

void foo(std::function<void(int&)>& bar);

以下调用编译成功:

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

这也编译成功:

std::function<void(int&)> myFunction = [](int& x) { ++x; };
foo(myFunction);

但是使用自动类型推导它突然无法编译:

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

据我所知,推导的 lambda 类型是未指定的,但它应该充当仿函数/可调用对象。我不明白的是,如何将相同的 lambda 分配给 std::function<void(int&)>是否不允许作为同一类型的函数参数传递?

在 GCC v4.8.5 上测试,使用 -std=c++11 .

最佳答案

鉴于这种情况;

std::function<void(int&)> myFunction = [](int& x) { ++x; };
foo(myFunction);

转换发生,结果存储在命名对象 myFunction 中。反过来,命名对象可以绑定(bind)到 foo 所需的引用。

考虑到另外两种情况;

foo([](int& x) { ++x; });
// and
auto myFunction = [](int& x) { ++x; };
foo(myFunction);

从命名对象 myFunction(在第二种情况下)到 std::function 的转换可以发生(在这两种情况下);但是会产生一个临时的。临时无法绑定(bind)到 foo 所需的 std::function 引用,因此出现错误。如下添加const允许代码编译;

void foo(std::function<void(int&)> const& bar);

允许临时对象绑定(bind)到 const 引用。

Sample code .

关于c++ - 自动类型推导并将 lambda 传递给 std::function 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41764035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com