Is constexpr supported with lambda functions / expressions?
C++C++11LambdaConstexprC++ Problem Overview
struct Test
{
static const int value = []() -> int { return 0; } ();
};
With gcc-4.6 I get something like, error: function needs to be constexpr
. I have tried multiple combinations of putting constexpr
at various places, but no luck.
Is constexpr
supported for lambda functions as well (irrespective of return
type specified or not) ? What is the correct syntax ?
Any work around possible ?
C++ Solutions
Solution 1 - C++
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 be constexpr
if it would satisfy
> the requirements of a constexpr
function (similar to the
> constexpr
inference that already occurs for implicitly defined
> constructors and the assignment operator functions).
Solution 2 - C++
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
.
Solution 3 - C++
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.
Solution 4 - C++
FFWD to year 2018 :)
auto my_const_expression_lambda = []()
constexpr -> bool
{
return true ;
}
Since c++17