为什么通过引用捕获变量的 lambda 不能转换为函数指针?
Why isn't a lambda that captures variables by reference convertible to a function pointer?
如果我有一个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()
将需要引用对象中的某种存储。如果它需要存储,则无法转换为原始函数指针。
我想换句话说lambda具有
&
捕获列表和正则函数,使得lambda不能转换为函数指针?
引用虽然不是对象,但需要存储在某个地方。一个正则函数不能访问另一个函数的局部变量;仅引用可以引用局部变量的引用(例如,作为参数)。以&
作为捕获默认值的Lambda可以,因为可以捕获所需的每个变量
换句话说:一个正则函数没有状态。具有捕获变量的闭包对象确实具有状态。因此,闭包对象不能简化为正则函数,因为状态会丢失。
相关文章:
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 为什么此指针值不能转换为整数的规则是什么?
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 不能在 if 语句 - c++ 中使用 void func 直接将字符串转换为大写
- 用户定义的转换不能在C++中使用static_cast
- 不能将字符转换为整数吗?
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 为什么我们不能将使用异或运算找到的整数转换为字符?
- 我把我的编译器从32位转换为64位,但我仍然不能使用超过2GB:(为什么
- 为什么我们不能使用整数到字符串直接转换,但可以按位到字符串?
- 为什么不能指向指针,在没有强制转换的情况下访问结构成员?
- 不能(隐式地)从字符**转换为常量字符**吗?
- 类型"const char[2]"的值不能隐式转换为"int"错误C++
- 为什么用户定义的转换函数模板不能有推导的返回类型?
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- 不能返回派生的类(无法转换)
- 已弃用从字符串常量到“char*”的转换:不能使用该常量
- C样式强制转换可以处理的转换,但C++强制转换不能
- 从char*到wchar*的转换不能正常工作