lambda 函数可以衰减到指向成员函数的指针吗?

问题描述

在我的理解中,Lambda 的行为应该与函数类似,甚至可以扩展它们的功能

因此,无捕获的 lambda 可以衰减为函数指针:

auto x = +[] (int x) {return x + 5;} // + triggers conversion to function pointer.

但是,我还没有找到一种方法来使 lambda 函数的行为类似于成员函数

例如,以下代码段不起作用:


class MyClass() {
   int x;
   static constexpr auto member_lambda_func = [this] () {return x + 5;}; //Does not compile. Cannot capture this.
};

此外,您甚至无法创建一个this 衰减为指向成员函数的指针的 lambda。

是否有制作 lambda 成员函数解决方法? 还是有充分的理由不这样做?

解决方法

如果 Lambda 是不可捕获的,它们可以衰减为函数指针,但如果它们捕获某些东西,它们就不能衰减为任何东西。特别是,如果它只捕获 this,它不能衰减到成员函数指针。

cppreference

,

Lambda 函数能否衰减为指向成员函数的指针?

简答:否。

Lambdas 只能转换为函数指针。并且成员函数指针不是函数指针(它们甚至不是指针)。

此外,只有非捕获 lambda 才能转换为函数指针。捕获 this 的 lambda 是捕获 lambda。

这样的东西可能有用 - 我不知道出于什么目的,但我能想到的最接近您的要求:

static constexpr auto member_lambda_func = [](const MyClass& self) {
    return self.x + 5;
};

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...