如果lambda接受auto
类型的参数,那么lambda的机器代码到底存储在哪里?
详细信息如下。
Lambda在编译时进行编译,不是吗?据我所知,编译要求在编译时就知道类型。
但如果是这样,那么MCVE怎么可能?
#include <typeinfo>
#include <iostream>
namespace My {
struct S {};
}
int main()
{
auto n = 42;
// An object n exists on the stack.
auto f = [](const auto n) {return n;};
// The f resembles a template. Does an object f exist on the stack?
const std::type_info& ti1 {typeid(f)};
const std::type_info& ti2 {typeid(f(My::S {}))};
std::cout
<< &n << " "
<< n << " "
<< &f << " " // If f is no object then why does this work?
<< ti1.name() << " "
<< ti2.name() << "\n";
return 0;
}
输出(已解散):0x7ffd6a22b41c 42 0x7ffd6a22b41b main::{lambda(auto:1)#1} My::S
这是否意味着在堆栈中不存在任何对象f
(可能除了占位符)?但是如果是这样,那么f
不是对象而是仅仅是模板,不是吗?
我很困惑。如果可以的话,请解释一下像f
这样的lambda是哪种编译时/运行时对象,编译器如何处理它,运行时它在哪里存在,大致如何将其布置在堆栈上, 等等。即使是部分答案也将不胜感激。
(我偶然发现,根据地址输出,f
或f
的占位符似乎在运行时正好占据了一个字节,但不知道该用什么含义注意,需要C ++ 14或更高版本的编译器,因为C ++ 11无法处理类似模板的lambda。)
相关: