将lambda分配给STD ::功能

assigning lambda to std::function

本文关键字:功能 STD lambda 分配      更新时间:2023-10-16

为什么允许第二个分配,当推断返回类型为std :: nullptr_t时?使用函数指针这是禁止的。

为什么第二个lambda不运行?

#include <cstdio>
#include <functional>
int main()
{
    std::function<void* ()> f;
    f = []() -> void* {
        printf ("runsn");
        return nullptr;
    };
    f();
    f = []() {
        printf ("doesn't runn");
        return nullptr; // -> std::nullptr_t
    };
    f();
    return 0;
}

std::function允许您存储任何东西,只要以下内容保留您提供的签名:

  • 所有参数类型都隐含地转换为存储可呼叫实体的参数类型,
  • 存储的可呼叫实体的返回类型隐式转换为签名的返回类型

std::nullptr_t隐式转换为任何指针类型,并产生该指针类型的空指针值。

请注意,您的代码实际上不是有效的C 11,因为您只有return expr;,并且在第二个Lambda中没有落后返回类型。因此,不会发生回报类型扣除。GCC(和Clang,IIRC)将其作为扩展实现,因为它将在某个时候成为标准的一部分。