Lambda表达式作为C++中的类模板参数14

wrw*_*rwt 6 c++ lambda templates language-lawyer c++14

现在的问题Lambda表达式作为类模板参数询问有关使用lambda表达式作为类模板参数的可能性.

这个问题的答案是否定的.但是,它是关于C++ 11的.

新标准C++ 14的情况有变吗?

Sha*_*our 2

不,C++14 中的情况根本没有改变,事实上5.1.2 Lambda 表达式2段中的语言已经从以下内容收紧:

\n\n
\n

lambda 表达式不得出现在未计算的操作数中(第 5 条)。

\n
\n\n

到:

\n\n
\n

[...]lambda 表达式不得出现在未计算的操作数\n(第 5 条)、模板参数、别名声明、\n typedef 声明或函数或函数的声明中\n n 模板位于其函数体和默认参数之外。[ 注意:\n 目的是防止 lambda 出现在签名中。\xe2\x80\x94end\n 注意][...]

\n
\n\n

缺陷报告 1607。模板参数中的 Lambda导致了此更改。

\n\n

缺陷报告只是间接地讨论了不允许这样做的理由,但我们可以在Rationale for lambda-expressions not allowed in unevaluated contexts中找到为什么不允许这样做的非常详细的解释。原因归结为:

\n\n
    \n
  • Lambda 表达式没有唯一类型
  • \n
  • 编译器实现问题:\n
      \n
    • 比如非凡的扩张SFINAE
    • \n
    • 可能需要命名破坏 lambda 的整个主体。
    • \n
  • \n
\n\n

考虑到这一限制的理由,它似乎不太可能改变。

\n