struct Test
{
static const int value = []() -> int { return 0; } ();
};
Gcc-4.6を使用すると、error: function needs to be constexpr
。 constexpr
をさまざまな場所に配置する複数の組み合わせを試しましたが、うまくいきませんでした。
constexpr
はラムダ関数でもサポートされていますか(return
タイプが指定されているかどうかに関係なく)?正しい構文は何ですか?
可能な回避策はありますか?
Update:C++ 17以降では、定数式でラムダを使用できます。
ラムダは現在(C++ 14)[expr.const] /(2.6)のように定数式では許可されていませんが、一度は N4487 は受け入れられます(作業ドラフトN4582にあります):
この提案では、定数式でlambda-expressionsを許可し、既存の制限を削除することを提案しています。著者は、特定のlambda-expressionと特定のクロージャオブジェクトに対する操作を定数式内に表示できるようにすることを提案しています。その際、各データメンバーの型がリテラル型である場合、クロージャー型をリテラル型と見なすことも提案します。また、ラムダ宣言子内で
constexpr
指定子が省略されている場合、生成された関数呼び出し演算子は、constexpr
関数の要件を満たす場合、constexpr
になります(同様の暗黙的に定義されたコンストラクターと代入演算子関数ですでに発生しているconstexpr
推論に)。
C++ 0x FDIS§7.1.5[dcl.constexpr]/1から:
constexpr
指定子は、変数の定義、関数または関数テンプレートの宣言、またはリテラル型の静的データメンバーの宣言にのみ適用されます。
ラムダ式はこれらのものではないため、constexpr
として宣言できません。
C++ 17より前のラムダはconstexpr
と互換性がありません。 定数式の内部では使用できません。
C++ 17以降、ラムダはconstexpr
であり、意味があります。提案 N4487 はC++ 17標準に組み込まれます。 彼のウェブサイト ISO C++委員会の委員長であるハーブサッターは次のように述べています。
ラムダは現在 constexpr関数内で許可されています です。
2018年までのFFWD :)
auto my_const_expression_lambda = []()
constexpr -> bool
{
return true ;
}
C++ 17以降