当推断的返回类型为 std::nullptr_t 时,为什么允许第二次赋值?对于函数指针,这是被禁止的。
为什么第二个 lambda 没有运行?
#include <cstdio>
#include <functional>
int main()
{
std::function<void* ()> f;
f = []() -> void* {
printf ("runs\n");
return nullptr;
};
f();
f = []() {
printf ("doesn't run\n");
return nullptr; // -> std::nullptr_t
};
f();
return 0;
}
最佳答案
std::function
允许您存储任何内容,只要以下内容适用于您提供的签名:
- 所有参数类型都可以隐式转换为存储的可调用实体的参数类型,并且
- 存储的可调用实体的返回类型可以隐式转换为签名的返回类型
std::nullptr_t
可隐式转换为任何指针类型并产生该指针类型的空指针值。
请注意,您的代码实际上不是有效的 C++11,因为您不仅在第二个 lambda 中有 return expr;
,因此不会发生返回类型推导。 GCC(和 Clang、IIRC)将其作为扩展来实现,因为它将在某个时候成为标准的一部分。
关于c++ - 将 lambda 分配给 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13212617/