我见过很多使用lambda表达式作为模板参数的例子,但是当我在cppreference.com读取lambda函数的参考页面时, 它有这么短的句子:
除了函数体和函数的默认参数之外,未评估的表达式,模板参数,别名声明,typedef声明以及函数(或函数模板)声明中的任何位置都不允许使用Lambda表达式。
我很困惑,这句话错了还是我没理解错了?
答案 0 :(得分:4)
你能做什么:
template <class>
struct Foo;
auto l = []{};
Foo<decltype(l)> f;
你不能做什么:
template <SomeType lambda>
struct Foo;
Foo<[]{}> f;
换句话说,lambda的类型与任何其他类型一样是普通类型,但lambda表达式本身不能用于专门化模板。这同样适用于未评估的上下文,例如decltype
和sizeof
的操作数。