今までまったく別物だと思ってたんだけど、C++のラムダ式は実のところファンクタの糖衣構文でしかないということに気づいた。
例えば以下のようなラムダ式:
auto f = [](int x) { |
は、内部的には operator()
を実装するクラスが作られて使用されるのと意味的には同じ:
struct F { |
で、その場でしか使用しない処理をわざわざクラスを作成せずに簡潔に書けるというのが利点ということになる。
変数がキャプチャされるケースも、コンストラクタでメンバ変数として保持してやれば実現できる。
注意点としては、 [=]
によりコピーキャプチャされた変数の書き換えはコンパイルエラーが出る:
int y = 0; |
ラムダ式により生成されるファンクタはデフォルトでは const
となることが原因:
int y = 0; |
とのこと。
デフォルトでは書き換えられないが、エラーメッセージの通り mutable
を指定すれば書き換えられる:
int y = 0; |
これはたぶん、書き換えられると意味的にまぎらわしいからデフォルトでは const
になっているのだと推測している。
というのは、ラムダ式をコピーするとキャプチャ自体もコピーされるので、実体が枝分かれしてしまう:
int y = 0; |