【问题标题】:Binding a const function reference to a lambda将 const 函数引用绑定到 lambda
【发布时间】:2019-07-01 04:33:22
【问题描述】:

这段代码

int(&foo)(int, int) = [](int a, int b) { return a + b; };

不编译,因为显然非常量引用不能用临时初始化。我应该把const放在哪里?

【问题讨论】:

  • 为什么它需要是一个 const ref?通过复制,编译器将利用移动语义
  • 它无法编译,因为 lambda 没有转换为引用。编译器错误具有误导性。
  • 为什么不直接使用auto foo = [](int a, int b) { return a + b; };? C++ 将移动而不是复制临时文件。
  • 不需要,我只是好奇如何/是否可以做到。

标签: c++ c++11 lambda


【解决方案1】:

如前所述,无捕获 lambda 可转换为函数指针。因此,如果您想将该静态函数绑定到引用,则需要取消引用该指针。

int(&foo)(int, int) = *[](int a, int b) { return a + b; };

* 应用于 lambda 会导致一堆机制启动。由于 lambda 不会重载 operator*,但确实实现了到指针类型的转换,因此会发生这种转换。之后* 应用于返回的指针并产生一个函数左值。然后该左值可以绑定到引用。

这里是live

【讨论】:

    【解决方案2】:

    只有不捕获的 lambda 才能转换为函数指针。

    没有 lambda-capture 的 lambda 表达式的闭包类型有一个公共的非虚拟非显式 const 转换函数,指向具有与闭包类型的函数调用运算符相同的参数和返回类型的函数的指针。这个转换函数的返回值应该是一个函数的地址,当被调用时,它与调用闭包类型的函数调用运算符具有相同的效果

    [Lambda Functions][1]
    

    我将您的代码更改为如下所示,并且成功了。

    int (*foo)(int, int)= [] (int a, int b) { return a + b; };
    int main()
    {
       cout << "Res:: " << foo(10,20);
       return 0;
    }
    

    我只是让它成为函数指针。

    或者,

    auto foo = [](int a, int b) { return a + b; }; 
    

    也是一个不错的选择。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2019-07-02
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      相关资源
      最近更新 更多