带有Lambda表达式的constexpr的C ++使用

古古利亚

我正在阅读《C ++ 17-完整指南》,在关于constexprlambda的6.1节中,作者提供了两个示例:

auto squared1 = [](auto val) constexpr { // example 1. compile-time lambda calls
  return val * val;
};

constexpr auto squared2 = [](auto val) { // example 2. compile-time initialization
  return val * val;
};

并且说这两者在示例1在编译时进行评估和示例2在编译时进行初始化的意义上彼此不同


然后作者发表以下我不完全理解的陈述:

如果(仅)lambda是constexpr它,则可以在编译时使用,但是如果由lambda初始化的(closure)对象为constexpr,则在程序启动时初始化该对象,但是lambda可能仍然是只能在以下位置使用的lambda运行时间(例如,使用静态变量)。因此,您可以考虑声明:

constexpr auto squared = [](auto val) constexpr { // example 3
  return val * val;
};

上面的陈述到底是什么意思?

显然,示例3中,constexpr关键字出现在squared2lambda对象的初始化语句上以及lambda表达式本身上,但是与示例1相比,我不明白关键字的优点是什么

刺柏

事实是,一个auto声明的对象不采用constexpr其初始化表达式本质,而仅采用其类型。并且constexpr该类型的一部分。看到:

为什么`auto`不采用其初始化表达式的constexpr'性?

因此,假设我有:

auto five_squared = 25;

值25非常大constexpr,即可以在编译时使用。但是-在编译时five_squared不可用。您仍然需要指出它是constexpr(*)。

Lambda基本上相同。Lambda是带有的现场定义类的实例operator()如果您自己不做任何事情,那将不会squared成为constexpr变量。


(*)-请注意,由于C ++语言中的特殊规则,const使用常量表达式初始化的整数是自动生成的constexpr,因此您可以编写const autoconstexpr隐式获取但是,这是一个必须记住的棘手的特殊情况,因此,如果要创建一个变量,constexpr我建议对其进行明确化。感谢@cigien提出这一点。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#如何使用带有字典值的lambda表达式,这是一种方法

来自分类Dev

使用if constexpr的条件constexpr表达式

来自分类Dev

在带有匿名方法的.net 2.0中使用Lambda表达式

来自分类Dev

为什么带有_的scala lambda无法使用&&组合两个布尔表达式

来自分类Dev

在带有匿名方法的.net 2.0中使用Lambda表达式

来自分类Dev

如何使用带有lambda表达式的DefaultDict来使默认值可变?

来自分类Dev

为什么带有_的scala lambda无法使用&&组合两个布尔表达式

来自分类Dev

如何使用带有 lambda 表达式的委托来总结数组中的奇数

来自分类Dev

如何在使用带有 lambda 表达式的 Pandas 应用函数时消除类型错误

来自分类Dev

使用C#创建带有反射的数值包含表达式?

来自分类Dev

目标c-使用带有多个表达式的SWITCH吗?

来自分类Dev

使用C#创建带有反射的数值包含表达式?

来自分类Dev

'this'不能在带有this->指针变量的常量表达式错误(C ++)中使用

来自分类Dev

如何使用带有线锚的 C# 正则表达式 Lookbehind

来自分类Dev

具有在表达式内使用的外部不可变变量的Lambda表达式

来自分类Dev

使用带有变量的正则表达式“查找”

来自分类Dev

使用带有正则表达式的sscanf输入

来自分类Dev

使用带有if表达式的sql计算多个值

来自分类Dev

使用float + Lambda表达式C#

来自分类Dev

在C#中使用反射创建Lambda表达式

来自分类Dev

使用条件表达式选择lambda表达式

来自分类Dev

在会话中使用Lambda表达式

来自分类Dev

如何使用|| 在lambda表达式中

来自分类Dev

如何使用Lambda表达式求和

来自分类Dev

使用lambda表达式的递归函数

来自分类Dev

使用lambda表达式的函数

来自分类Dev

使用Lambda表达式的子查询

来自分类Dev

使用Lambda表达式设置方法

来自分类Dev

在会话中使用Lambda表达式

Related 相关文章

  1. 1

    C#如何使用带有字典值的lambda表达式,这是一种方法

  2. 2

    使用if constexpr的条件constexpr表达式

  3. 3

    在带有匿名方法的.net 2.0中使用Lambda表达式

  4. 4

    为什么带有_的scala lambda无法使用&&组合两个布尔表达式

  5. 5

    在带有匿名方法的.net 2.0中使用Lambda表达式

  6. 6

    如何使用带有lambda表达式的DefaultDict来使默认值可变?

  7. 7

    为什么带有_的scala lambda无法使用&&组合两个布尔表达式

  8. 8

    如何使用带有 lambda 表达式的委托来总结数组中的奇数

  9. 9

    如何在使用带有 lambda 表达式的 Pandas 应用函数时消除类型错误

  10. 10

    使用C#创建带有反射的数值包含表达式?

  11. 11

    目标c-使用带有多个表达式的SWITCH吗?

  12. 12

    使用C#创建带有反射的数值包含表达式?

  13. 13

    'this'不能在带有this->指针变量的常量表达式错误(C ++)中使用

  14. 14

    如何使用带有线锚的 C# 正则表达式 Lookbehind

  15. 15

    具有在表达式内使用的外部不可变变量的Lambda表达式

  16. 16

    使用带有变量的正则表达式“查找”

  17. 17

    使用带有正则表达式的sscanf输入

  18. 18

    使用带有if表达式的sql计算多个值

  19. 19

    使用float + Lambda表达式C#

  20. 20

    在C#中使用反射创建Lambda表达式

  21. 21

    使用条件表达式选择lambda表达式

  22. 22

    在会话中使用Lambda表达式

  23. 23

    如何使用|| 在lambda表达式中

  24. 24

    如何使用Lambda表达式求和

  25. 25

    使用lambda表达式的递归函数

  26. 26

    使用lambda表达式的函数

  27. 27

    使用Lambda表达式的子查询

  28. 28

    使用Lambda表达式设置方法

  29. 29

    在会话中使用Lambda表达式

热门标签

归档