【问题标题】:How to create a pointer in the lambda capture list?如何在 lambda 捕获列表中创建指针?
【发布时间】:2021-10-13 10:13:06
【问题描述】:

我们如何在 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 = ...
}

【问题讨论】:

  • a=void*{nullptr} -> a=(void*)nullptr 虽然我真的怀疑你是否需要这个。你用指针做什么?

标签: c++ c++ pointers lambda initialization c++14


【解决方案1】:

您可以将static_castnullptr 转为void*

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

话虽如此,您似乎想要捕获指向 lambda 的某些任意类型的指针。不应该使用模板来完成吗?也许你想看看generic lambdatemplate parameter lists in lambda expressions


感谢 @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),可以隐式转换为任何指针和指向成员类型的指针。

【讨论】:

  • 使用std::nullptr_t 使这毫无用处,因为这样的指针无法更改为实际指向某物。您的前两个示例等效于a = nullptr。只有第三个 sn-p a = static_cast&lt;void*&gt;(nullptr) 可能有用。
  • int x; std::nullptr_t p = &amp;x; 无法编译。 int x; void *p = &amp;x; 确实如此。
  • @HolyBlackCat 已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多