c++ - 为什么通过引用捕获变量的 lambda 不能转换为函数指针?

标签 c++ c++11 lambda function-pointers

如果我有一个通过引用捕获所有自动变量的 lambda ([&] {}),为什么它不能转换为函数指针?常规函数可以修改变量,就像通过引用捕获所有内容的 lambda 一样,那么为什么不一样呢?

换句话说,我想,具有 & 捕获列表的 lambda 与常规函数之间的功能区别是什么,以至于 lambda 不能转换为函数指针?

最佳答案

让我们以一个简单的 lambda 为例:

Object o;
auto foo = [&]{ return o; };

foo 的类型是什么样的?它可能看起来像这样:

struct __unique_unspecified_blah
{
    operator()() const {
        return o;
    }

    Object& o;
};

你能创建一个指向那个 operator() 的函数指针吗?不,你不能。该函数需要一些来自其对象的额外信息。这与您无法将典型的类方法转换为原始函数指针的原因相同(没有 this 所在的额外第一个参数)。假设您确实创建了一些 this 指针 - 它如何知道从哪里获取 o

问题的“引用”部分不相关 - 如果您的 lambda 捕获任何东西,那么它的operator() 将需要引用目的。如果它需要存储,它不能转换为原始函数指针。

关于c++ - 为什么通过引用捕获变量的 lambda 不能转换为函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26692007/

相关文章:

c++ - 在模板中匹配 C++ lambda 表达式

python - Keras Lambda层没有输出张量形状,编译模型时出错

c++ - 如果参数采用引用,在函数参数中传递 *this 会导致内存泄漏吗?

c++ - 如何禁用然后启用 MessageBox 中的重试按钮?

c++ - C++ 会使用复制赋值运算符中的 move 构造函数吗?

c++ - 对 Variadic 模板与 Visual Studio 2010 的混淆

c++ - 从 CMake/clang 警告生成代码气候报告

java - 如果调用 JNI DeleteGlobalRef(),相应的 java 对象是否会被垃圾回收?

regex - 在大约 2013 年的编译器中使用 C++11 <regex> 的选项

lambda - 在方案中使用 lambda 而不是 let