通用lambda:语法糖还是不是?

建设者

C ++ 14通用lambda是否对语言进行了真正的改进,还是它们是一种语法糖?是否有某些情况

[](auto param1, auto param2, /* ... */ auto paramN)
{
    return /* ... */;
}

不能被替换

template <typename Type1, typename Type2, /* ... */ typename TypeN>
auto foo(Type1&& param1, Type2&& param2, /* ... */ TypeN&& paramN)
{
    return  /* ... */;
}

或者

struct bar
{
    template <typename Type1, typename Type2, /* ... */ typename TypeN>
    auto operator()(Type1&& param1, Type2&& param2, /* ... */ TypeN&& paramN)
    {
        return  /* ... */;
    }
};


@Kerrek SB在注释中提供了非常有趣的链接,这些链接说明了通用lambda的功能:

吕克·丹顿

对于C ++ 11的非泛型lambda表达式,可以执行一些直接的转换:

void foo()
{
    int i = 42; int j = 22;
    auto f = [i, &j](int k) { return i + j + k };
    // proceed to use f
 }

例如:

void foo()
{
    int i = 42; int j = 22;
    struct {
        int i; int& j;
        // can't deduce return type
        int operator()(int k) const
        { return i + j + k; }
    } f { i, j };
    // proceed to use f
}

对于C ++ 14的通用lambda表达式,并不是那么简单。假设这次我们使用auto f = [i, &j](auto k) { return i + j + k; }然后,我们必须产生以下调用运算符:

template<typename T>
auto operator()(T k) const { return i + j + k; }

问题在于我们无法在功能范围内定义模板(一种限制,也称为无本地模板)。因此,我们必须将封闭类型定义从封闭函数中移出至名称空间范围(在过程中为其命名),然后使用closure_type f { i, j };顺便说一句,这意味着我们必须给类及其操作符某种形式的链接,而函数局部定义没有链接。

因此,从某种意义上说,通用lambda表达式为我们提供了局部功能模板的有限版本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是-如果不是-只是语法糖吗?

来自分类Dev

如何在php中使用“替代语法”而不是“ curly-brace语法”?(使用Endswitch语法糖)

来自分类Dev

Java程序包是嵌套的,还是不是嵌套的?两者都是吗?

来自分类Dev

适用于Android / iOS应用和网站的私有RESTful Web服务。是还是不是?

来自分类Dev

使用带有空 dom 树 (<></>) 的子/兄弟组件来获取数据?是还是不是?

来自分类Dev

使用Pythonic方式,语法糖还是运算符将函数应用于自身?

来自分类Dev

LINQ循环实际上更快还是仅仅是语法糖?

来自分类Dev

信号插槽的语法糖

来自分类Dev

VBA语法糖

来自分类Dev

是否有可能识别对象是由垃圾收集器收集的,还是不是在Java中?

来自分类Dev

我们是否必须遵循为Eclipse ADT添加Eclipse ADT插件的步骤,还是不是必需的?

来自分类Dev

JavaScript继承问题不一致(所有子对象的父实例是单个实例...还是不是?)

来自分类Dev

在规格中使用描述/功能而不是功能/场景有优势吗?(除语法糖外)

来自分类Dev

Gerrit是不是同时更新的?

来自分类Dev

是不是总是叫ondestroy?

来自分类Dev

Python是不是捕捉异常

来自分类Dev

word是不是拼写检查?

来自分类Dev

这个主题是不是很眼熟?

来自分类Dev

星号是不是字符常量?

来自分类Dev

是build_语法糖吗?

来自分类Dev

做语法糖和赋值

来自分类Dev

pentadactyl-命令的语法糖

来自分类Dev

语法糖的Haskell剥离功能

来自分类Dev

IN 语法糖来自 = ANY 吗?

来自分类Dev

什么时候使用功能模板而不是通用lambda?

来自分类Dev

是否可以static_assert确定lambda不是通用的?

来自分类Dev

即使组件不重复且没有属性(Vue或任何其他js库),也可以使用组件简化长HTML。是还是不是?

来自分类Dev

不拍人是不是很贪心?

来自分类Dev

变量“ using”是不是类型名称?

Related 相关文章

  1. 1

    是-如果不是-只是语法糖吗?

  2. 2

    如何在php中使用“替代语法”而不是“ curly-brace语法”?(使用Endswitch语法糖)

  3. 3

    Java程序包是嵌套的,还是不是嵌套的?两者都是吗?

  4. 4

    适用于Android / iOS应用和网站的私有RESTful Web服务。是还是不是?

  5. 5

    使用带有空 dom 树 (<></>) 的子/兄弟组件来获取数据?是还是不是?

  6. 6

    使用Pythonic方式,语法糖还是运算符将函数应用于自身?

  7. 7

    LINQ循环实际上更快还是仅仅是语法糖?

  8. 8

    信号插槽的语法糖

  9. 9

    VBA语法糖

  10. 10

    是否有可能识别对象是由垃圾收集器收集的,还是不是在Java中?

  11. 11

    我们是否必须遵循为Eclipse ADT添加Eclipse ADT插件的步骤,还是不是必需的?

  12. 12

    JavaScript继承问题不一致(所有子对象的父实例是单个实例...还是不是?)

  13. 13

    在规格中使用描述/功能而不是功能/场景有优势吗?(除语法糖外)

  14. 14

    Gerrit是不是同时更新的?

  15. 15

    是不是总是叫ondestroy?

  16. 16

    Python是不是捕捉异常

  17. 17

    word是不是拼写检查?

  18. 18

    这个主题是不是很眼熟?

  19. 19

    星号是不是字符常量?

  20. 20

    是build_语法糖吗?

  21. 21

    做语法糖和赋值

  22. 22

    pentadactyl-命令的语法糖

  23. 23

    语法糖的Haskell剥离功能

  24. 24

    IN 语法糖来自 = ANY 吗?

  25. 25

    什么时候使用功能模板而不是通用lambda?

  26. 26

    是否可以static_assert确定lambda不是通用的?

  27. 27

    即使组件不重复且没有属性(Vue或任何其他js库),也可以使用组件简化长HTML。是还是不是?

  28. 28

    不拍人是不是很贪心?

  29. 29

    变量“ using”是不是类型名称?

热门标签

归档