c++ - 为什么 C++ 中的 lambda 永远不会 DefaultConstructible

标签 c++ c++11 lambda default-constructor

我的 lambdas 不捕获任何东西,比如

[](){};

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

旁注: Understanding how Lambda closure type has deleted default constructor正在问一个不同的问题,尽管标题似乎非常相似。它询问如何在没有可用的默认构造函数的情况下创建无状态 lambda 对象。我在问为什么没有可用的默认构造函数。

最佳答案

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<+[](){}>是 DefaultConstructible 的无操作函数对象。

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

关于c++ - 为什么 C++ 中的 lambda 永远不会 DefaultConstructible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38722631/

相关文章:

c++ - 在boost中为斐波那契堆定义比较函数

c++ - 让 Code::Blocks 和 Visual Studio 中的 C++ 编译器遵守 C++(11) 标准?

c++ - 读写迭代器 - C++

c++ - std::find 包含指针的 vector

Java 8 Lambda Sort With Variable 方法引用

c++ - C++动态库中的导出函数

c++ - 默认情况下通过引用传递的数组?

templates - 带有空括号和结构的模板特化

python - 将两个正则表达式 - lambda 函数合并为一个

python - lambda 与 tkinter 的工作方式很奇怪