【发布时间】:2016-07-11 15:58:21
【问题描述】:
我已经看到很多使用 lambda 表达式作为模板参数的示例,但是当我在 cppreference.com 阅读 lambda 函数的参考页面时, 它有这样一个简短的句子:
Lambda 表达式不允许出现在未计算的表达式、模板参数、别名声明、typedef 声明以及函数(或函数模板)声明中除函数体和函数的默认参数之外的任何地方。
我很困惑,这句话是错的还是我没有理解正确?
【问题讨论】:
我已经看到很多使用 lambda 表达式作为模板参数的示例,但是当我在 cppreference.com 阅读 lambda 函数的参考页面时, 它有这样一个简短的句子:
Lambda 表达式不允许出现在未计算的表达式、模板参数、别名声明、typedef 声明以及函数(或函数模板)声明中除函数体和函数的默认参数之外的任何地方。
我很困惑,这句话是错的还是我没有理解正确?
【问题讨论】:
你可以做什么:
template <class>
struct Foo;
auto l = []{};
Foo<decltype(l)> f;
你不能做什么:
template <SomeType lambda>
struct Foo;
Foo<[]{}> f;
换句话说,lambda 的类型和其他类型一样是普通类型,但 lambda 表达式本身不能用于特化模板。这同样适用于未评估的上下文,例如 decltype 和 sizeof 的操作数。
【讨论】: