可以使用lambda表达式吗as类模板参数? (请注意,这是一个与this one,询问 lambda 表达式本身是否可以模板化。)
我问你是否可以做这样的事情:
template <class Functor>
struct Foo { };
// ...
Foo<decltype([]()->void { })> foo;
例如,在类模板具有各种参数的情况下,这将很有用,例如equal_to
或其他东西,通常作为单行函子实现。例如,假设我想实例化一个使用我自己的自定义相等比较函数的哈希表。我希望能够这样说:
typedef std::unordered_map<
std::string,
std::string,
std::hash<std::string>,
decltype([](const std::string& s1, const std::string& s2)->bool
{ /* Custom implementation of equal_to */ })
> map_type;
但我在 GCC 4.4 和 4.6 上测试了这个,它不起作用,显然是因为 lambda 表达式创建的匿名类型没有默认构造函数。 (我记得有一个类似的问题boost::bind
.) 是否有某种原因标准草案不允许这样做,或者我错了,它是允许的,但 GCC 在实施方面落后了?
从 C++20 开始,这个答案已经过时了。 C++20 在未计算的上下文中引入了无状态 lambda1:
此限制最初是为了防止 lambda 表达式出现在签名中而设计的,因为 lambda 表达式需要具有唯一的类型,因此签名中可能会出现破坏的情况。不过,限制比需要的要强得多,没有它确实可以达到同样的效果
一些限制仍然存在(例如 lambda 仍然不能出现在函数签名上),但所描述的用例现在完全有效,并且不再需要声明变量。
我问你是否可以做这样的事情:
Foo<decltype([]()->void { })> foo;
不,你不能,因为 lambda 表达式不应出现在未计算的上下文中(例如decltype
and sizeof
, 在其他人中)。
C++0x FDIS,5.1.2 [expr.prim.lambda] p2
lambda 表达式的求值会产生临时纯右值 (12.2)。这个临时的称为
闭包对象。lambda 表达式不应出现在未计算的操作数中(第 5 条)。 [注:A
闭包对象的行为类似于函数对象(20.8)。-尾注](强调我的)
您需要首先创建一个特定的 lambda,然后对其使用 decltype:
auto my_comp = [](const std::string& left, const std::string& right) -> bool {
// whatever
}
typedef std::unordered_map<
std::string,
std::string,
std::hash<std::string>,
decltype(my_comp)
> map_type;
这是因为每个 lambda 派生的闭包对象都可以具有完全不同的类型,它们就像匿名的毕竟功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)