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

C++ lambda函数/表达式是否支持constexpr?,c++,c++11,lambda,constexpr,C++,C++11,Lambda,Constexpr,在gcc-4.6中,我得到了类似于,错误:函数需要是constexpr。我在不同的地方尝试了多种组合的Putingconstexpr,但没有成功 lambda函数是否也支持constepr(无论是否指定return类型)?正确的语法是什么 C++0x FDIS§7.1.5[dcl.constexpr]/1中的任何可能的解决方法: constepr说明符只能应用于变量的定义、函数或函数模板的声明或文本类型的静态数据成员的声明 lambda表达式不是这些东西,因此不能在常量表达式中声明lambda

在gcc-4.6中,我得到了类似于,
错误:函数需要是constexpr
。我在不同的地方尝试了多种组合的Puting
constexpr
,但没有成功

lambda函数是否也支持
constepr
(无论是否指定
return
类型)?正确的语法是什么


C++0x FDIS§7.1.5[dcl.constexpr]/1中的任何可能的解决方法:

constepr
说明符只能应用于变量的定义、函数或函数模板的声明或文本类型的静态数据成员的声明


lambda表达式不是这些东西,因此不能在常量表达式中声明lambda


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

这项建议建议允许lambda表达式保持不变 表达式,删除现有限制。作者建议 某些lambda表达式和对某些闭包的操作 对象不能出现在常量表达式中。这样做, 我们还建议,如果 其每个数据成员的类型都是文本类型;如果 lambda声明符中省略了
constepr
说明符,即 如果满足以下条件,则生成的函数调用运算符应为
constexpr
constexpr
功能的要求(类似于
constexpr
对于隐式定义的 构造函数和赋值运算符函数)


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

从C++17开始lambda是有意义的
constepr
。该提案将被纳入C++17标准。ISO C++委员会主席萨特博士在以下方面指出:

兰姆达斯现在是

截至2018年的FFWD:)


既然c++17

在什么情况下,
constexpr
lambda函数会有用?在我看来,它最终只会在实际情况下增加一对大括号expression@bdonlan,我有一个这样的用例(在宏中计算
\uu VA\u ARGS\uu
的数量)。但解释这一点将是一个全新的问题。还要看看解决方法是什么?您试图用
constexpr
lambda表达式实现什么?为什么不能使用普通函数或函数模板?我可以使用lambda表达式在运行时计算宏的
\uu VA\u ARGS\uu
数。只需将其设置为
constexpr
将是一个编译时常量。解释这将是一个详细的新话题。我知道有可用的
boost
替代方法,但我使用的方法似乎非常直接和方便。为什么不使用
VA_NARGS
并在预处理时进行计算(参见示例)。或者使用可变模板和
sizeof…()
?类似于
模板计数器{static const size_t N=sizeof…(Args);},然后使用
计数器::N
,如果宏参数是类型。。。或者使用
constexpr size_t f(Args…Args)const{return sizeof…(Args);}
进行更详细的操作,如果您的参数不是类型。@JosephGarvin是的。变量模板被添加到可以是
constexpr
但与lambdas无关的东西中。
struct Test
{
  static const int value = []() -> int { return 0; } ();
};
auto my_const_expression_lambda = []()
  constexpr -> bool
{
   return true ;
}