8

当推断的返回类型为 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;
}
4

1 回答 1

11

std::function允许您存储任何内容,只要您提供的签名符合以下条件:

  • 所有参数类型都可以隐式转换为存储的可调用实体的参数类型,并且
  • 存储的可调用实体的返回类型可隐式转换为签名的返回类型

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

请注意,您的代码实际上不是有效的 C++11,因为您不仅return expr;在第二个 lambda 中有 a,因此不会发生返回类型推导。GCC(和 Clang,IIRC)将此作为扩展实现,因为它会在某个时候成为标准的一部分。

于 2012-11-03T19:26:51.007 回答