首页 > 解决方案 > 如何在 lambda 捕获列表中创建指针?

问题描述

我们如何在 lambda 捕获列表中创建指针?例如,我们可以创建一个整数变量并使 lambda 有状态:

auto lambda1 = [a = int{ 5 }]() mutable {
    a = 3;
}

但是,当我们将 a 更改为指针时,编译器不起作用:

auto lambda2 = [a = void* { nullptr }]() mutable {
    a = ...;
}

另一种解决方法是在外面声明一个指针,然后复制它,但这似乎很多余

void* a;
auto lambda3 = [a]() mutable {
    a = ...
}

标签: c++pointerslambdainitializationc++14

解决方案


你可以static_castnullptrvoid*

auto lambda2 = [a = static_cast<void*>(nullptr)]() mutable {
    // ..
};

话虽如此,您似乎想将指向某些任意类型的指针捕获到 lambda。不应该使用模板来完成吗?也许你想看看 lambda 表达式中的通用 lambda模板参数列表


感谢@HolyBlackCat指出这一事实,这std::nullptr_t不适用于此案

int x; 
std::nullptr_t p = &x;// error: 'initializing': cannot convert from 'int *' to 'nullptr'

因此它不能用于这种情况。

您可以按如下方式使用 std::nullptr_t
#include <cstddef> // std::nullptr_t

auto lambda2 = [a = std::nullptr_t{}]() mutable {
    // ...
};

std::nullptr_t是空指针文字的类型,nullptr. 它是一种独特的类型,它本身不是指针类型或指向成员类型的指针。它的值是空指针常量(请参阅 参考资料NULL),并且可以隐式转换为任何指针和指向成员类型的指针。


推荐阅读