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

时间:2011-06-21 03:39:56

标签: c++ c++11 lambda constexpr

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

使用gcc-4.6我得到类似error: function needs to be constexpr的内容。我尝试过多次将constexpr放在不同的地方,但没有运气。

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

任何可行的工作?

4 个答案:

答案 0 :(得分:26)

更新:从C ++ 17开始,lambdas被允许用于常量表达式。

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

  

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

答案 1 :(得分:25)

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

  

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

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

答案 2 :(得分:10)

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

从C ++ 17开始 lambdas是constexpr,这是有意义的。提案N4487将被纳入C ++ 17标准。在his website ISO C ++委员会主席Herb Sutter上声明如下:

  

Lambda现在是allowed inside constexpr functions

答案 3 :(得分:2)

FFWD到2018年:)

polymorohism

从c ++ 17开始