C++

C++17 Constexpr Lambda

  • このエントリーをはてなブックマークに追加
  • Pocket

C++17 テクニック #5

tl;dr

C++17からラムダ式がconstexprの文脈で使えるようになった。

static_assertの中で使ったりできるようになった。

仕様

ラムダ式をconstexprの文脈で使うことができる

キャプチャが無いか、もしくは全てのキャプチャがコンパイル時定数の場合、

ラムダ式をconstexprの文脈で使うことができる。

クロージャは、暗黙でリテラル型として扱われる

キャプチャが無いか、もしくは全てのキャプチャがコンパイル時定数の場合、

ラムダ式の生成するクロージャは自動的にリテラル型のオブジェクトとして扱われる。

ラムダ式にconstexpr修飾をつけることができる

修飾を書く場所はmutableを書いていたところである。

mutableとconstexprはどちらを先に書いてもよい。

constexpr修飾するとラムダ式のoperator()がconstexprとして扱われる。

ラムダ式のoperator()は自動的にconstexpr指定される

ラムダ式がconstexpr関数としての条件を満たす場合(つまりラムダ式のキャプチャが無いか、全てコンパイル時定数とき)、operator()は自動的にconstexpr指定される。

ラムダ式の関数ポインタへの変換もコンパイル時に行える

変換された関数ポインタもコンパイル時に呼び出せる。

SFINAEの文脈で用いる事はできない

以下のような記述を許可してしまうとあらゆる文や式が実体化に成功するかをチェックでてしまうため、禁止されている。

雑なconstexpr lambdaの使い所3選

with static_assert

static_assertの中で何気なくloopを回したりできるようになった。

テストのためだけのフリー関数を書かんくていいメリットがある。

ただ、コンパイル時に制御文をぶん回しすぎると、

コンパイル時間もメモリ消費も増加の一途をたどる。

ほどほどにしないとストレスの原因になる。

 

with constexpr variable (template)

かなり複雑な処理で初期化したい場合でも、ラムダ式をぽん。

constexpr variableでもできるようになりました。

もうフリー関数にまみれなくていい。

メタ関数の実装に使う

上記の応用でメタ関数の実装に使えるのではないかというアレ。

例として、第一テンプレート引数にメタ関数をとり、

第二引数以降の型に順番にメタ関数を適用して最初にtrueになる位置を返すメタ関数を書いた。

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す

*