C++11 嵌套lambda捕获
当访问“run”lambda中的变量a时,我观察到地址与main中的“a”不同。这只发生在这种lambda嵌套中。这是意料之中的事吗?我只能用这种非琐碎的嵌套进行复制 我在lambda中用gdb检查地址,如下->\uu\a 使用gdb在lambda中打印a会产生垃圾,而lambda在lambda对象中有捕获的参数,这就是为什么我感到困惑的原因,这个->\uu a与a有不同的地址:C++11 嵌套lambda捕获,c++11,lambda,C++11,Lambda,当访问“run”lambda中的变量a时,我观察到地址与main中的“a”不同。这只发生在这种lambda嵌套中。这是意料之中的事吗?我只能用这种非琐碎的嵌套进行复制 我在lambda中用gdb检查地址,如下->\uu\a 使用gdb在lambda中打印a会产生垃圾,而lambda在lambda对象中有捕获的参数,这就是为什么我感到困惑的原因,这个->\uu a与a有不同的地址: (gdb) p &a $5 = (unsigned int *) 0x7fffffffdce8 (gdb)
(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(预发布)中可以看到这种行为
#包括
#包括
#包括
#包括
#包括
#包括
#包括这是一个简单的三段论:
- 打印
&a
会产生正确的值
- 观察
这个->\u a
会产生一个不同的值
因此
这与&a
不是一回事
那么我们如何解释这一点呢<代码>此->\uuu a
可能是一个包含a
描述的对象,编译器可能在其中放置了任何类型的元数据用于调试或任何其他目的。这是gcc中的一个错误。现在修好了
请参见的行为完全符合我的预期(GCC 4.6)——您认为会发生什么,发生了什么?您是否使用调试器查看了地址?如果您只是在运行lambda中打印&a,结果就是预期的结果,但这不是lambda使用的真正的“a”,即->__a@piotr:如果打印出地址或在程序中使用地址,而不是在调试器中插入地址,会发生什么?调试器中观察到的值不算作可观察的副作用,因此,作为优化的一部分,编译器几乎可以自由更改它们。@Piotr:我没有调试,我只是观察到输出,它似乎以我期望的方式操作
a
。你到底担心什么?我会做更多的研究并公布我的结果。
#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;
}