【问题标题】:Return type of closure in C++C++ 中闭包的返回类型
【发布时间】:2021-01-03 01:03:35
【问题描述】:

我正在尝试学习 C++ 中的闭包。这个例子有效:

auto add_n(int n) {
    return [=](int x) -> int {
        return x + n;
    };
};
auto add_3 = add_n(3);
add_3(5); //8

add_n 期望输出什么类型?我希望能够使用一个函数指针,它接受一个 int 并返回一个 int 作为返回类型?

typedef int (*fptr)(int);
fptr add_n(int n) {
    return [=](int x) -> int {
        return x + n;
    }; 
};

此外,如果我改用模板,是否还需要做其他事情?谢谢!

【问题讨论】:

  • add_n 的返回值是一些编译器生成的类类型,不能轻易命名(但可以通过decltype 别名)。它不能是一个普通的函数指针——没有空间来存储捕获的n
  • Lambda(或闭包)具有不可命名的类型。通常你不能明确地指定类型(除非 lambda 恰好没有捕获并且你的返回类型是相应的函数指针类型)。
  • “如果我使用模板而不是?”,不确定您将在何处以及如何添加模板,但从我认为可能的用途来看,我看不到额外的工作。
  • 谢谢大家!如果没有捕获,它允许使用该语法,但似乎不太有用...@Jarod42 我在想template <typename num> auto add_n(num n)template <typename num> typedef num (*fptr)(num); fptr add_3() { 之类的东西,但由于捕获的限制,第二个将毫无用处。跨度>
  • 唯一的规则是不捕获任何内容的 lambda 可以隐式转换为函数指针。但这并不意味着它 一个函数指针。如果它确实捕捉到了某些东西,那么,就没有这样的运气了。

标签: c++ pointers closures function-pointers return-type


【解决方案1】:

每个 lambda 都有自己的未命名类型,因此您不能将 auto 替换为其真实类型。

带捕获的 Lambda 无法转换为函数指针。

【讨论】:

    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多