const lambda 是什么意思?

新手上路,请多包涵
#include <iostream>
int foo(int i)
{
    const auto a = [&i](){ i = 7; return i * i; };
    a();
    return i;
}
int main()
{
    std::cout << foo(42) << std::endl;
    return 0;
}

这编译( g++ -std=c++11 -Wall -Wextra -Wpedantic main.cpp )并返回 49 。这让我感到惊讶,因为通过将 a 声明为一个常量对象,我本来希望 i 被引用为 const int& 。显然不是,为什么呢?

原文由 Vorac 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 661
2 个回答

Lambda 就像非 Lambda 一样,只是它们的实现细节是隐藏的。因此,使用非 lambda 仿函数可能更容易解释:

 #include <iostream>
int foo(int i)
{
    struct F {
      int &i;
      int operator()() const { i = 7; return i * i; }
    };
    const F a {i};
    a();
    return i;
}
int main()
{
    std::cout << foo(42) << std::endl;
    return 0;
}

F 有一个 int & 参考成员 iconst F 不能修改其实例数据,但修改 i 不是修改其实例数据。对其实例数据的修改将重新绑定 i 到另一个对象(无论如何都是不允许的)。

原文由 user743382 发布,翻译遵循 CC BY-SA 3.0 许可协议

[&i](){ i = 7; return i * i; }

主要相当于

class Lambda
{
public:
    Lambda(int& arg_i) : i(arg_i) {}

    auto operator() () const { i = 7; return i * i;}
private:
    int& i;
};

所以你有:

 const Lambda a(i);
a();

并且 const Lambda 不会将其成员 提升const int& i;int& const i; 相当于 int& i;

原文由 Jarod42 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题