λ是否是适当的对象?

时间:2019-03-17 21:36:27

标签: c++ lambda stack c++14 c++17

如果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是哪种编译时/运行时对象,编译器如何处理它,运行时它在哪里存在,大致如何将其布置在堆栈上, 等等。即使是部分答案也将不胜感激。

(我偶然发现,根据地址输出,ff的占位符似乎在运行时正好占据了一个字节,但不知道该用什么含义注意,需要C ++ 14或更高版本的编译器,因为C ++ 11无法处理类似模板的lambda。)

相关:

0 个答案:

没有答案