web-dev-qa-db-ja.com

constexprはラムダ関数/式でサポートされていますか?

struct Test
{
  static const int value = []() -> int { return 0; } ();
};

Gcc-4.6を使用すると、error: function needs to be constexprconstexprをさまざまな場所に配置する複数の組み合わせを試しましたが、うまくいきませんでした。

constexprはラムダ関数でもサポートされていますか(returnタイプが指定されているかどうかに関係なく)?正しい構文は何ですか?

可能な回避策はありますか?

56
iammilind

Update:C++ 17以降では、定数式でラムダを使用できます。


ラムダは現在(C++ 14)[expr.const] /(2.6)のように定数式では許可されていませんが、一度は N4487 は受け入れられます(作業ドラフトN4582にあります):

この提案では、定数式でlambda-expressionsを許可し、既存の制限を削除することを提案しています。著者は、特定のlambda-expressionと特定のクロージャオブジェクトに対する操作を定数式内に表示できるようにすることを提案しています。その際、各データメンバーの型がリテラル型である場合、クロージャー型をリテラル型と見なすことも提案します。また、ラムダ宣言子内でconstexpr指定子が省略されている場合、生成された関数呼び出し演算子は、constexpr関数の要件を満たす場合、constexprになります(同様の暗黙的に定義されたコンストラクターと代入演算子関数ですでに発生しているconstexpr推論に)。

27
Columbo

C++ 0x FDIS§7.1.5[dcl.constexpr]/1から:

constexpr指定子は、変数の定義、関数または関数テンプレートの宣言、またはリテラル型の静的データメンバーの宣言にのみ適用されます。

ラムダ式はこれらのものではないため、constexprとして宣言できません。

25
James McNellis

C++ 17より前のラムダはconstexprと互換性がありません。 定数式の内部では使用できません。

C++ 17以降、ラムダはconstexprであり、意味があります。提案 N4487 はC++ 17標準に組み込まれます。 彼のウェブサイト ISO C++委員会の委員長であるハーブサッターは次のように述べています。

ラムダは現在 constexpr関数内で許可されています です。

10
Ralph Tandetzky

2018年までのFFWD :)

auto my_const_expression_lambda = []()
  constexpr -> bool
{
   return true ;
}

C++ 17以降

3
user5560811