lambda 表达式的类型

在 C++ 中,lambda 表达式实际上是一个匿名的闭包类型(closure type),每个 lambda 表达式都有自己独特的类型。这种类型是编译器为该 lambda 生成的匿名类,通常无法直接写出它的类型名。可以通过 decltype 获得该类型。

理解 lambda 表达式的类型

当我们定义一个 lambda 表达式时,编译器会为其生成一个匿名类并在其中定义 operator()。例如:

auto deleter = [](int* ptr) {
    std::cout << "Lambda deleter called\n";
    delete ptr;
};

上述 lambda 在编译器内部等价于:

struct __lambda_deleter {
    void operator()(int* ptr) const {
        std::cout << "Lambda deleter called\n";
        delete ptr;
    }
};

因此,deleter 的类型是一个匿名类,具有 operator()

使用 decltype 获取 lambda 的类型

如果需要把 lambda 的类型用作模板参数或类型别名,可以使用 decltype

using DeleterType = decltype(deleter);
DeleterType d = deleter; // 复制 lambda 对象

一个常见场景是为 std::unique_ptr 提供自定义删除器:

#include <memory>
#include <iostream>

int main() {
    auto del = [](int* p){ std::cout << "delete: " << *p << '\n'; delete p; };
    using DelType = decltype(del);

    std::unique_ptr<int, DelType> p(new int(42), del);
    // 或者直接写成: std::unique_ptr<int, decltype(del)> p(new int(42), del);
}

注意:lambda 的类型通常很长且是匿名的,直接把 decltype(lambda) 写入模板参数是常见做法。若需要类型擦除或更灵活的传递方式,可使用 std::function(有性能开销):

#include <functional>
std::function<void(int*)> f = del;

小结:lambda 是匿名类,decltype(lambda) 可用于获取其确切类型,常用于需要类型作为模板参数的场景(例如 unique_ptr 的自定义删除器)。

©OZY all right reserved该文件修订时间: 2025-09-20 05:42:10

评论区 - 11_lambda表达式的类型

results matching ""

    No results matching ""