嵌套的lambda捕获

时间:2011-07-05 12:04:29

标签: c++11 lambda

当访问变量a里面的“run”lambda时,我发现地址与main中的'a'不同。这种情况只发生在这种lambda嵌套中。这是预期的吗?我只能通过这种非平凡的嵌套来重现。

我在lambda中使用gdb检查地址为this-> __ a

使用gdb在lambda内部打印会产生垃圾,而lambda在lambda对象中有捕获的参数,这就是为什么这个 - > __ a的地址不同于:

(gdb) p &a
$5 = (unsigned int *) 0x7fffffffdce8
(gdb) p *this
$6 = {__a = @0x7fffffffdde8}
(gdb) p a
$7 = 4207233
(gdb) p this->__a
$8 = (unsigned int &) @0x7fffffffdde8: 2

当lambda没有嵌套时,我记得观察到相同的地址。

目前在g ++ - 4.5(Debian 4.5.3-3)4.5.3和g ++ - 4.6(Debian 4.6.0-10)4.6.1 20110526(预发布)中看到了这种行为

#include <string>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <stdexcept>
#include <stdint.h>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
    unsigned a = 0;
    vector<int> vi = {0, 1, 2, 3, 4 };

    auto run = [&](int& i) {
        // inside this lambda &a is not the same as the &a in the first line
        cout << "i: " << i << endl;
        a++;
        cout << "a: " << a << endl;

    };
    for_each(vi.begin(), vi.end(), [&](int& xi) {
        run(xi);
    });

    cout << "a: " << a << endl;
}

我填写了与此问题相关的以下bug报告: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49651

2 个答案:

答案 0 :(得分:1)

这是gcc中的一个错误。它现在已修好。

请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49651

答案 1 :(得分:-1)

这是一个简单的三段论:

  • 打印&a会产生正确的值。
  • 观察this->__a会产生不同的值。

麦角

  • this->__a&a
  • 不同

那我们该怎么解释呢? this->__a可能是包含a description 的对象,编译器可能已在其中放置任何类型的元数据以用于调试或任何其他目的。