gpt4 book ai didi

c++ - 为什么不能将 `decltype()` 用于 lambda 的 `std::function<>`?

转载 作者:行者123 更新时间:2023-12-04 01:02:01 25 4
gpt4 key购买 nike

我们知道decltype()可用于获取变量类型,如下所示:

int a = 0;
using a_t = decltype(a);
a_t b = -1; // it worked, and type of b is int

但这对这个不起作用:

auto f = [](int a) -> int { return a + 1;}; // the type of callable should be int(int)?

std::function<decltype(f)> F(f); // error
std::function<int(int)> G(f); // worked

为什么?有什么方法可以获取 lambda 表达式的函数类型(在 <> 中)?

最佳答案

这完全是对 std::function 的不当使用 wrapper 。此类型旨在隐藏实际实现,方法是将其包装到类型删除对象中,并尽可能少地提供有关底层可调用对象的信息:这就是函数签名。

当您使用 decltype(f) 时,您将获得 lambda 表达式的实际唯一的、编译器生成的类型。但这不是实例化 std::function 的方式。 ,作为基本的非专用模板 template<class> std::function未定义。只有特化template<class R, class ...Args> std::function<R(Args...)>已定义,您不能使用 lambda 表达式的类型实例化它。

请注意,所有 lambda 表达式也有一个签名:它们接受一些参数(可能是模板参数类型)并返回某种类型的值。这些是您需要输入 std::function 的信息实例化。在你的情况下 int(int)正如您发布的那样。

关于c++ - 为什么不能将 `decltype()` 用于 lambda 的 `std::function<>`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67999522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com