是否使用lambda函数/expression式支持constexpr?
struct Test { static const int value = []() -> int { return 0; } (); };
有了gcc-4.6,我得到了类似的error: function needs to be constexpr
。 我尝试过在各个地方放置constexpr
多种组合,但没有运气。
是否也支持lambda函数的constexpr
(不pipe是否指定return
types)? 什么是正确的语法?
任何可能的工作?
Lambdas目前(C ++ 14)不允许在常量expression式[expr.const] /(2.6)中,但是一旦N4487被接受(可以在工作草案N4582中find):
这个build议build议在常量expression式中允许使用lambdaexpression式,消除现有的限制。 作者提出,某些闭包对象的某些lambdaexpression式和操作允许在常量expression式中出现。 在这样做的时候,我们也build议如果每个数据成员的types是一个文字types的话,那么闭包types就被认为是一个文字types; 如果在lambda声明符中省略了
constexpr
说明符,那么如果生成的函数调用操作符能够满足constexpr
函数的要求(类似于隐式定义的构造函数和赋值运算符已经出现的constexpr
推理function)。
从C ++ 0x FDIS§7.1.5[dcl.constexpr] / 1:
constexpr
说明符只能应用于variables的定义,函数或函数模板的声明或者文字types的静态数据成员的声明。
lambdaexpression式不是这些东西,因此可能不会被声明为constexpr
。
之前的C ++ 17 lambda与constexpr
不兼容。 它们不能在常量expression式中使用 。
从C ++ 17开始, lambdaexpression式是constexpr
,它是有意义的。 提案N4487将被放入C ++ 17标准。 在他的网站上,ISO C ++委员会主席Herb Sutter指出:
现在允许 Lambda 在constexpr函数内 。