我的lambda无法捕获任何内容,例如
[](){};
我有一个模板类,其中包含这样的lambda。由于lambda不包含非静态数据成员,也不包含虚拟函数,因此应为空类,并且为DefaultConstructible。这只是可用于模板元编程的一种策略类。我想知道,为什么这样的类不能由C ++标准默认构造。
旁注: 了解Lambda闭包类型如何删除默认构造函数的问题是一个不同的问题,尽管标题似乎非常相似。它询问如何在没有可用的默认构造函数的情况下创建无状态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<+[](){}>
是一个什么都不做的函数对象,它是缺省构造。
这实际上并没有包装lambda,而是包装了lambda产生的指向函数的指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句