gpt4 book ai didi

c++11 - 嵌套的 lambda 捕获

转载 作者:行者123 更新时间:2023-12-03 17:58:50 24 4
gpt4 key购买 nike

当访问变量 a 内部“运行” lambda 时,我观察到地址与 main 中的“a”不同。这只发生在这种 lambda 嵌套中。这是意料之中的吗?我只能用这种非平凡的嵌套进行复制。

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

使用 gdb 在 lambda 内部打印 a 会产生垃圾,而 lambda 在 lambda 对象中具有捕获的参数,这就是为什么让我感到困惑的是 this->__a 与 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 (prerelease) 中看到这种行为
#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;
}

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

最佳答案

这是 gcc 中的一个错误。现在已经修复了。

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

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

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