Is constexpr supported with lambda functions / expressions?

C++C++11LambdaConstexpr

C++ 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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioniammilindView Question on Stackoverflow
Solution 1 - C++ColumboView Answer on Stackoverflow
Solution 2 - C++James McNellisView Answer on Stackoverflow
Solution 3 - C++Ralph TandetzkyView Answer on Stackoverflow
Solution 4 - C++user5560811View Answer on Stackoverflow