C++17を知るその5~教育委員会~

ついに5回目。

今回はラムダ式に関してやります。

ラムダ式自体はC++に限らずほかの言語でも取り入れているところは多くてRubyだと

こんな感じで書けますがC++では

こんな感じです。

C++でのラムダ式は11から使用できるようになったのですがC++17でラムダに関する変更がありましたそれを今回やります。

・ラムダ式での*thisのコピーキャプチャ

ラムダ式では例のように値をキャプチャすることができます。
例では変数をしていしてラムダ内で使用できるようになっていますがこの例だと値渡しになっています。
参照渡しにするには
[&a] とかにすると参照渡しとなりラムダ式内で変更するとその値が外で宣言した変数も変わります。
[&]とするとすべての外部変数が参照で、[=]だと値渡しとなります。

でここにthisを使用するとthisポインタがコピーされます。
が、このthisポインタが指すオブジェクトがすでに破棄されている可能性があります。
例えば非同期処理で動作していた場合thisポインタが破棄されている可能性があるのでラムダ式内で使用すると..

これがC++14まででした。
今回C++17では[this]とすることでキャプチャ時点でのthisオブジェクトをコピーできるようになりました。
これはかなり便利なのではないでしょうか。

ちなみに[=, *this]とするとデフォルトのコピーキャプチャと併用することができるようです。
[this, *this]はダメとのこと。

がここで注意。
[this]でキャプチャするとオブジェクトはデフォルトでconstになるとのこと。[this]の場合はポインタであるため書き換えができ、非constでメンバ関数が
呼び出せます。
[
this]の場合で非constメンバ関数を呼び出す場合はmutableとつける必要がある。

・constexpr ラムダ
constexpr自体はC++11で追加されたものです。
constexprは、汎用的に定数式を表現するための機能です。
なのでC++11より前は

こんな感じだとエラーになりますがconstの部分をC++11ではconstexprにすると

OKになります。(このままだと変数未使用で警告が出たりしますが)

C++17ではラムダ式をconstexpr関数に使用することができるため

こんな感じで書くことができます。
暗黙的にconstexprその結果の要件を満たしている場合、constexpr関数となります。

この機能が必要になった背景を引用すると、

ラムダがconstexprでないことによって不要に複雑なコードを書くことは混乱のもとであるとして、C++17にconstexprラムダが提案された。

早い対応。
短いけど今回はこれまで。

過去分
C++17を知るその1
C++17を知るその2
C++17を知るその3
C++17を知るその4

About the author

naito06

C++やったり、PythonやったりPHPだったり。

Add Comment

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

By naito06

最近の投稿

アーカイブ

カテゴリー

タグクラウド

コーポレートサイト