C++ VS2010中不同大小的lambda表达式?

C++ VS2010中不同大小的lambda表达式?,c++,visual-studio-2010,lambda,C++,Visual Studio 2010,Lambda,出于好奇,我测试了一个lamba表达式的大小。我的第一个想法是,它们将4字节大,就像一个函数指针。奇怪的是,我第一次测试的输出是1: auto my_lambda = [&]() -> void {}; std::cout << sizeof(my_lambda) << std::endl; auto my_lambda2 = [&]() -> void {int i=5, j=23; std::cout << i*j <&

出于好奇,我测试了一个lamba表达式的大小。我的第一个想法是,它们将
4
字节大,就像一个函数指针。奇怪的是,我第一次测试的输出是
1

auto my_lambda = [&]() -> void {};
std::cout << sizeof(my_lambda) << std::endl;
auto my_lambda2 = [&]() -> void {int i=5, j=23; std::cout << i*j << std::endl;};
std::cout << sizeof(my_lambda2) << std::endl;
我的下一个想法是随机的,但是输出最终改变了,显示了等待的
4

auto my_lambda3 = [&]() -> void {std::cout << sizeof(my_lambda2) << std::endl;};
std::cout << sizeof(my_lambda3) << std::endl;

auto my_lambda3=[&]()->void{std::coutVisual Studio可能没有将lambda对象实现为函数。您可能正在获取一个对象。谁知道它是什么样子的。如果您真的感兴趣,您可以随时使用调试器查看变量,看看它们是什么样的……如果它允许的话。

感谢@Hans Passant在问题下的评论,t他找到了解决方案。我最初的方法是错误的,因为我认为每个对象都会被lambda捕获,但事实并非如此,只有在封闭范围内的对象才会被捕获,并且只有在使用它们的情况下才会被捕获。

对于所有捕获的对象,使用4个字节(引用的大小)

这是一个C++规则,一个对象的大小永远不能为零。你的第三λ捕获了一个值,需要存储。@汉斯:第二个不应该捕获<代码> STD::CUT对象吗?但是,有趣的是,我只是测试了它,它恰好如你所说,每个捕获值4字节。不,它不是局部变量。@汉斯:也许你的评论A回答,这样我就可以投票并接受你了?;)继续写下你的发现,接受它作为答案。