struct Test
{
static const int value = []() -> int { return 0; } ();
};
使用gcc-4.6我得到类似error: function needs to be constexpr
的内容。我尝试过多次将constexpr
放在不同的地方,但没有运气。
lambda函数是否也支持constexpr
(不管指定的return
类型是什么)?什么是正确的语法?
任何可行的工作?
答案 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开始