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生成的指向函数的指针.