gpt4 book ai didi

c++ - 无法在未指定捕获默认值的 lambda 中隐式捕获变量

转载 作者:太空狗 更新时间:2023-10-29 21:39:55 26 4
gpt4 key购买 nike

我正在关注这个人关于 C++ Lambdas 的博文 http://cpptruths.blogspot.com/2014/03/fun-with-lambdas-c14-style-part-1.html在编译他的代码时,我遇到了一个编译器错误:

variable 'unit' cannot be implicitly captured in a lambda with no capture-default specified"

它引用的行如下:

auto unit = [](auto x) {
return [=](){ return x; };
};
auto stringify = [](auto x) {
stringstream ss;
ss << x;
return unit(ss.str());
};

这家伙似乎知道 C++ 中的 Lambda 新功能,而我当然不知道,这就是我现在来这里的原因。有人可以阐明这个问题吗?我需要做什么才能正确编译此代码?

提前致谢! :)


编辑:事实证明问题不在于 unit 或 stringify。让我粘贴新代码:

auto unit = [](auto x) {
return [=](){ return x; };
};

auto stringify = [unit](auto x) {
stringstream ss;
ss << x;
return unit(ss.str());
};

auto bind = [](auto u) {
return [=](auto callback) {
return callback(u());
};
};

cout << "Left identity: " << stringify(15)() << "==" << bind(unit(15))(stringify)() << endl;
cout << "Right identity: " << stringify(5)() << "==" << bind(stringify(5))(unit)() << endl;
//cout << "Left identity: " << stringify(15)() << endl;
//cout << "Right identity: " << stringify(5)() << endl;

好的,所以,对“绑定(bind)”的调用是导致以下错误的原因:

"__ZZZ4mainENK4$_17clINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEEDaT_ENUlvE_C1ERKSA_", referenced from:
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > main::$_19::operator()<auto main::$_17::operator()<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const::'lambda'()>(auto main::$_17::operator()<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const::'lambda'()) const in funwithlambdas-0f8fc6.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [funwithlambdas] Error 1

我会再试一试,如果我修复了它,我会在此处发布,但如果可以,请发布您的解决方案或发表评论。再次感谢!

最佳答案

你去吧:

auto unit = [](auto x) {
return [=](){ return x; };
};
auto stringify = [unit](auto x) { // or '&unit
stringstream ss;
ss << x;
return unit(ss.str());
};

Lambda 不捕获任何外部作用域,您必须指定它。

编辑:用户“T.C.”是对的——在那篇文章中,两个 lambda 表达式都是全局的。在这种情况下,unit 会在没有指定的情况下被访问。根据规范(我给出的),它在 VC2015 中失败。

关于c++ - 无法在未指定捕获默认值的 lambda 中隐式捕获变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31841907/

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