constexpr是否支持lambda函数/表达式?

iam*_*ind 55 c++ lambda constexpr c++11

struct Test
{
  static const int value = []() -> int { return 0; } ();
};
Run Code Online (Sandbox Code Playgroud)

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

constexpr支持lambda函数(不管return指定的类型与否)?什么是正确的语法?

任何可能的工作?

Col*_*mbo 28

更新:从C++ 17开始,lambdas被允许在常量表达式中.


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

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


Jam*_*lis 25

从C++ 0xFDIS§7.1.5[dcl.constexpr]/1:

constexpr说明符将只适用于一个变量,函数或函数模板的声明,或文字类型的静态数据成员的声明中的定义.

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

  • 为什么不使用`VA_NARGS`并在预处理时进行计算(参见[本回答开头]的示例](http://stackoverflow.com/questions/6194031/iterating-variadic-macro-arguments/6194669#6194669 )). (2认同)

Ral*_*zky 11

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

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

Lambda现在允许在constexpr函数中.


小智 6

FFWD 到 2018 年 :)

auto my_const_expression_lambda = []()
  constexpr -> bool
{
   return true ;
}
Run Code Online (Sandbox Code Playgroud)

从 C++17