66
struct Test
{
  static const int value = []() -> int { return 0; } ();
};

使用 gcc-4.6 我得到类似的东西,error: function needs to be constexpr. 我constexpr在不同的地方尝试了多种组合,但没有运气。

是否constexpr也支持 lambda 函数(无论是否return指定类型)?什么是正确的语法?

任何可能的解决方法?

4

4 回答 4

36

更新:从 C++17 开始,常量表达式中允许使用 lambda。


根据 [expr.const]/(2.6),目前 (C++14) 不允许在常量表达式中使用 Lambda,但一旦N4487被接受(可以在工作草案 N4582 中找到),它们就会:

该提案建议允许在常量表达式中使用lambda表达式,从而消除现有的限制。作者建议允许某些lambda-expression和对某些闭包对象的操作出现在常量表达式中。在这样做时,我们还建议如果闭包类型的每个数据成员的类型都是文字类型,则将其视为文字类型;并且,如果constexpr在 lambda-declarator 中省略了说明符,则生成的函数调用运算符constexpr将​​满足constexpr函数的要求(类似于 constexpr隐式定义的构造函数和赋值运算符函数已经发生的推断)。

于 2015-09-21T14:06:08.033 回答
27

来自 C++0x FDIS §7.1.5[dcl.constexpr]/1:

说明constexpr符应仅应用于变量的定义、函数或函数模板的声明,或文字类型的静态数据成员的声明。

lambda 表达式不是这些东西,因此可能不会被声明constexpr

于 2011-06-21T03:48:29.993 回答
14

在 C++17 之前, lambda 不兼容constexpr. 它们不能在常量表达式中使用。

从 C++17 lambda 开始是constexpr有意义的。N4487提案将被纳入 C++17 标准。ISO C++ 委员会主席 Herb Sutter在他的网站上表示:

现在允许在 constexpr 函数中使用 Lambda 。

于 2016-08-09T10:35:20.203 回答
8

FFWD 到 2018 年 :)

auto my_const_expression_lambda = []()
  constexpr -> bool
{
   return true ;
}

从 c++17

于 2018-02-23T23:39:37.383 回答