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

Ral*_*zky 18 c++ lambda default-constructor c++11

我有没有抓住任何东西的lambdas,比如

[](){};
Run Code Online (Sandbox Code Playgroud)

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

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

Yak*_*ont 10

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)...);
  }
};
Run Code Online (Sandbox Code Playgroud)

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

这实际上并不包装lambda,而是lambda生成的指向函数的指针.

  • @ PeterA.Schneider它[将带有空捕获组的lambda转换为函数指针.](http://stackoverflow.com/questions/18889028/a-positive-lambda-what-sorcery-is-this) (3认同)
  • 在 C++20 中,不带捕获的 lambda 是默认可构造的。 (3认同)