struct Test
{
static const int value = []() -> int { return 0; } ();
};
使用 gcc-4.6 我得到类似的东西,error: function needs to be constexpr
. 我constexpr
在不同的地方尝试了多种组合,但没有运气。
是否constexpr
也支持 lambda 函数(无论是否return
指定类型)?什么是正确的语法?
任何可能的解决方法?
更新:从 C++17 开始,常量表达式中允许使用 lambda。
根据 [expr.const]/(2.6),目前 (C++14) 不允许在常量表达式中使用 Lambda,但一旦N4487被接受(可以在工作草案 N4582 中找到),它们就会:
该提案建议允许在常量表达式中使用lambda表达式,从而消除现有的限制。作者建议允许某些lambda-expression和对某些闭包对象的操作出现在常量表达式中。在这样做时,我们还建议如果闭包类型的每个数据成员的类型都是文字类型,则将其视为文字类型;并且,如果
constexpr
在 lambda-declarator 中省略了说明符,则生成的函数调用运算符constexpr
将满足constexpr
函数的要求(类似于constexpr
隐式定义的构造函数和赋值运算符函数已经发生的推断)。
来自 C++0x FDIS §7.1.5[dcl.constexpr]/1:
说明
constexpr
符应仅应用于变量的定义、函数或函数模板的声明,或文字类型的静态数据成员的声明。
lambda 表达式不是这些东西,因此可能不会被声明constexpr
。
在 C++17 之前, lambda 不兼容constexpr
. 它们不能在常量表达式中使用。
从 C++17 lambda 开始是constexpr
有意义的。N4487提案将被纳入 C++17 标准。ISO C++ 委员会主席 Herb Sutter在他的网站上表示:
现在允许在 constexpr 函数中使用 Lambda 。
FFWD 到 2018 年 :)
auto my_const_expression_lambda = []()
constexpr -> bool
{
return true ;
}
从 c++17