我的 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/