C++ lambda函数/表达式是否支持constexpr?
在gcc-4.6中,我得到了类似于,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
错误:函数需要是constexpr
。我在不同的地方尝试了多种组合的Putingconstexpr
,但没有成功
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 ;
}