在没有指定capture-default的lambda中无法隐式捕获变量

时间:2015-08-05 20:08:37

标签: c++ macos c++11 g++ c++14

我正在关注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;

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

"__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

我会更多地使用它,如果我修复它,我会在这里发布,但如果你能够发布你的解决方案或评论。再次感谢!

1 个答案:

答案 0 :(得分: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中失败。