为什么C ++中的Lambda永远不会DefaultConstructible

拉尔夫·坦德斯基(Ralph Tandetzky)

我的lambda无法捕获任何内容,例如

[](){};

我有一个模板类,其中包含这样的lambda。由于lambda不包含非静态数据成员,也不包含虚拟函数,因此应为空类,并且为DefaultConstructible。这只是可用于模板元编程的一种策略类。我想知道,为什么这样的类不能由C ++标准默认构造。

旁注: 了解Lambda闭包类型如何删除默认构造函数的问题是一个不同的问题,尽管标题似乎非常相似。它询问如何在没有可用的默认构造函数的情况下创建无状态lambda对象。我在问为什么没有可用的默认构造函数。

Yakk-亚当·内夫罗蒙特

打算先创建Lambda,然后再使用。该标准因此说“不,他们没有默认的构造函数”。制作一个的唯一方法是通过lambda表达式或相同的副本。

它们并非旨在让您保留并使用它们的类型。这样做有违反ODR的风险,而要求编译器避免违反ODR的行为会使符号处理变得过于复杂。

但是,在C ++ 17中,您可以围绕函数指针编写无状态包装器:

template<auto fptr>
struct function_pointer_t {
  template<class...Args>
  // or decltype(auto):
  std::result_of_t< std::decay_t<decltype(fptr)>(Args...) >
  operator()(Args&&...args)const
    return fptr(std::forward<Args>(args)...);
  }
};

正如operator void(*)()[](){}constexpr在C ++ 17,function_pointer_t<+[](){}>是一个什么都不做的函数对象,它是缺省构造。

这实际上并没有包装lambda,而是包装了lambda产生的指向函数的指针。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么for(;;)永远不会终止?

来自分类Dev

程序在C ++中运行而不会永远停止

来自分类Dev

为什么等待线程不会永远等待

来自分类Dev

为什么这不会永远持续下去?

来自分类Dev

为什么光标永远不会为空?

来自分类Dev

为什么eof()永远不会返回true?

来自分类Dev

为什么while循环永远不会结束?

来自分类Dev

规则永远不会减少,了解为什么

来自分类Dev

为什么节点程序永远不会终止?

来自分类Dev

为什么“连接”永远不会被触发?

来自分类Dev

如果我在脚本中更改用户,为什么运行su的脚本似乎永远不会终止?

来自分类Dev

如果我在脚本中更改用户,为什么运行su的脚本似乎永远不会终止?

来自分类Dev

为什么此循环永远不会超过列表中的第一项?

来自分类Dev

为什么以下脚本中的回调函数永远不会被调用?

来自分类Dev

为什么 softmax 交叉熵损失在张量流中永远不会给出零值?

来自分类Dev

这个C程序为什么不会崩溃?

来自分类Dev

为什么 Ctrl + C 不会杀死在终端中运行的 Python?

来自分类常见问题

为什么在C ++ 14中对lambda使用std :: bind?

来自分类Dev

为什么我不能捕获C ++中的递归lambda函数?

来自分类Dev

为什么我的指令的链接功能永远不会被调用?

来自分类Dev

为什么这个简单的Akka Streams程序永远不会终止?

来自分类Dev

为什么此Haskell代码永远不会终止?

来自分类Dev

为什么执行此块永远不会结束?

来自分类Dev

为什么最后一行永远不会被读取?

来自分类Dev

为什么(!(feof(sp))&& end)永远不会评估为真?

来自分类Dev

为什么vkAcquireNextImageKHR()永远不会阻塞我的线程?

来自分类Dev

为什么对isspace()的调用永远不会返回true?

来自分类Dev

为什么我的委托方法永远不会被调用?

来自分类Dev

为什么这种情况不会永远持续下去?

Related 相关文章

  1. 1

    为什么for(;;)永远不会终止?

  2. 2

    程序在C ++中运行而不会永远停止

  3. 3

    为什么等待线程不会永远等待

  4. 4

    为什么这不会永远持续下去?

  5. 5

    为什么光标永远不会为空?

  6. 6

    为什么eof()永远不会返回true?

  7. 7

    为什么while循环永远不会结束?

  8. 8

    规则永远不会减少,了解为什么

  9. 9

    为什么节点程序永远不会终止?

  10. 10

    为什么“连接”永远不会被触发?

  11. 11

    如果我在脚本中更改用户,为什么运行su的脚本似乎永远不会终止?

  12. 12

    如果我在脚本中更改用户,为什么运行su的脚本似乎永远不会终止?

  13. 13

    为什么此循环永远不会超过列表中的第一项?

  14. 14

    为什么以下脚本中的回调函数永远不会被调用?

  15. 15

    为什么 softmax 交叉熵损失在张量流中永远不会给出零值?

  16. 16

    这个C程序为什么不会崩溃?

  17. 17

    为什么 Ctrl + C 不会杀死在终端中运行的 Python?

  18. 18

    为什么在C ++ 14中对lambda使用std :: bind?

  19. 19

    为什么我不能捕获C ++中的递归lambda函数?

  20. 20

    为什么我的指令的链接功能永远不会被调用?

  21. 21

    为什么这个简单的Akka Streams程序永远不会终止?

  22. 22

    为什么此Haskell代码永远不会终止?

  23. 23

    为什么执行此块永远不会结束?

  24. 24

    为什么最后一行永远不会被读取?

  25. 25

    为什么(!(feof(sp))&& end)永远不会评估为真?

  26. 26

    为什么vkAcquireNextImageKHR()永远不会阻塞我的线程?

  27. 27

    为什么对isspace()的调用永远不会返回true?

  28. 28

    为什么我的委托方法永远不会被调用?

  29. 29

    为什么这种情况不会永远持续下去?

热门标签

归档