Is constexpr supported with lambda functions / expressions?
Update: As of C++17, lambdas are permitted in constant expressions.
Lambdas are currently (C++14) not allowed in constant expressions as per [expr.const]/(2.6), but they will once N4487 is accepted (which can be found in the working draft N4582):
This proposal suggests allowing lambda-expressions in constant expressions, removing an existing restriction. The authors propose that certain lambda-expressions and operations on certain closure objects be allowed to appear within constant expressions. In doing so, we also propose that a closure type be considered a literal type if the type of each of its data-members is a literal type; and, that if the
constexpr
specifier is omitted within the lambda-declarator, that the generated function call operator beconstexpr
if it would satisfy the requirements of aconstexpr
function (similar to theconstexpr
inference that already occurs for implicitly defined constructors and the assignment operator functions).
From the C++0x FDIS §7.1.5[dcl.constexpr]/1:
The
constexpr
specifier shall be applied only to the definition of a variable, the declaration of a function or function template, or the declaration of a static data member of a literal type.
A lambda expression is none of those things and thus may not be declared constexpr
.
Prior to C++17 lambdas are not compatible with constexpr
. They cannot be used inside constant expressions.
Starting with C++17 lambdas are constexpr
where it makes sense. The proposal N4487 will be put into the C++17 standard. On his website Herb Sutter, chair of the ISO C++ committee, stated the following:
Lambdas are now allowed inside constexpr functions.
FFWD to year 2018 :)
auto my_const_expression_lambda = []()
constexpr -> bool
{
return true ;
}
Since c++17