gpt4 book ai didi

c++ - 嵌套的 lambda 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:43 27 4
gpt4 key购买 nike

我有以下代码:

auto get_functor = [&](const bool check) {
return [&](const foo& sr)->std::string {
if(check){
return "some string";
}
return "another string"
};
};
run(get_functor(true));

run 函数签名:

void run(std::function<std::string(const foo&)> func);

我收到以下错误,我不太清楚:

error C2440: 'return' : cannot convert from 'main::<lambda_6dfbb1b8dd2e41e1b6346f813f9f01b5>::()::<lambda_59843813fe4576d583c9b2877d7a35a7>' to 'std::string (__cdecl *)(const foo &)'

附言我在 MSVS 2013

编辑:

如果我通过将 auto 替换为真实类型来编辑代码:

std::function<std::string(const foo&)> get_functor1 = [&](const bool check) {
return [&](const foo& sr)->std::string {
if (check) {
return "some string";
}
return "another string";
};
};
run(get_functor1(true));

我收到另一个错误:

error C2664: 'std::string std::_Func_class<_Ret,const foo &>::operator
()(const foo &) const' : cannot convert argument 1 from 'bool' to
'const foo &'

这完全是一团糟!

最佳答案

我能够使用以下 MVCE 在 VS 2013 上重现相同的错误:

#include <iostream>
#include <functional>
#include <string>

struct foo {};

std::string run(std::function<std::string(foo const&)> f) {
return f(foo());
}

int main() {

auto get_functor = [&](bool const check) {
return [=](foo const&) -> std::string { // Line of the compiler error
if (check) {
return "CHECK!";
}
else {
return "NOT CHECK!";
}
};
};

std::cout << run(std::function<std::string(foo const&)>(get_functor(true)));
return 0;
}

然后我得到错误:

Error   1   error C2440: 'return' : cannot convert from 'main::<lambda_1bc0a1ec72ce6dc00f36e05599609bf6>::()::<lambda_4e0981efe0d720bad902313b44329b79>' to 'std::string (__cdecl *)(const foo &)'

问题在于 MSVC 无法处理返回的 lambda:当您未指定返回类型时,它会尝试将其衰减为常规函数指针。这失败了,因为您的 lambda 确实捕获了元素!

此外,自std::function<std::string(foo const&)> 以来,您的修复是错误的不是 get_functor 的类型而是您要从中返回的类型。

强制嵌入 std::function返回的 lambda 直接在 get_functor 中将解决您的问题:

auto get_functor = [&](bool const check) -> std::function<std::string(foo const&)> {
return [=](foo const&) -> std::string {
if (check) {
return "some string";
} else {
return "another string";
}
};
};
std::cout << run(get_functor(true));

关于c++ - 嵌套的 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43581415/

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