📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
細 Wiki がページ「ラムダ式の基礎(C++)」を「C++の基礎 - ラムダ式」に、リダイレクトを残さずに移動しました |
細 文字列「source lang」を「syntaxhighlight lang」に置換 |
||
| (同じ利用者による、間の2版が非表示) | |||
| 15行目: | 15行目: | ||
<br><br> | <br><br> | ||
== ラムダ式の文法 == | |||
<syntaxhighlight lang="c++"> | |||
< | |||
int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||
{ | { | ||
| 28行目: | 27行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br><br> | ||
< | == 最小のラムダ式の定義 == | ||
<syntaxhighlight lang="c++"> | |||
int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||
{ | { | ||
| 38行目: | 38行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
引数は省略可能であるため、さらに省略できる。<br> | 引数は省略可能であるため、さらに省略できる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||
{ | { | ||
| 48行目: | 48行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br><br> | ||
== 最小のラムダ式の呼び出し == | |||
ラムダ式を呼び出すには、関数呼び出し式()を使用する。<br> | ラムダ式を呼び出すには、関数呼び出し式()を使用する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||
{ | { | ||
| 58行目: | 59行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br><br> | ||
== サンプルコード == | |||
===== ラムダ式で書くHello World ===== | ===== ラムダ式で書くHello World ===== | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
| 70行目: | 73行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== ラムダ式を変数に代入する ===== | ===== ラムダ式を変数に代入する ===== | ||
ラムダ式を変数に代入することができる。関数ポインタのような感覚で呼び出せる。<br> | ラムダ式を変数に代入することができる。関数ポインタのような感覚で呼び出せる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
| 84行目: | 87行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== ラムダ式を関数に渡す ===== | ===== ラムダ式を関数に渡す ===== | ||
ラムダ式を別の関数に渡すことができる。(コールバック関数)<br> | ラムダ式を別の関数に渡すことができる。(コールバック関数)<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
| 103行目: | 106行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== ラムダ式に引数を与える ===== | ===== ラムダ式に引数を与える ===== | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
#include <string> | #include <string> | ||
| 120行目: | 123行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== ラムダ式で戻り値を返す ===== | ===== ラムダ式で戻り値を返す ===== | ||
| 126行目: | 129行目: | ||
1つ目は、明示的に戻り値の型を定義していない。<br> | 1つ目は、明示的に戻り値の型を定義していない。<br> | ||
2つ目は、明示的に戻り値の型を定義している。アロー演算子の記法([]()->型)で表現している。<br> | 2つ目は、明示的に戻り値の型を定義している。アロー演算子の記法([]()->型)で表現している。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
| 139行目: | 142行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== 変数のキャプチャ ===== | ===== 変数のキャプチャ ===== | ||
ラムダ式は、式が定義される関数のスコープの変数をキャプチャできる。<br> | ラムダ式は、式が定義される関数のスコープの変数をキャプチャできる。<br> | ||
JavaScriptでいうクロージャが、スコープにある変数を参照できることをイメージすること。<br> | JavaScriptでいうクロージャが、スコープにある変数を参照できることをイメージすること。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
#include <string> | #include <string> | ||
| 156行目: | 159行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== 参照の場合の代入 ===== | ===== 参照の場合の代入 ===== | ||
参照での代入とコピーでの代入を行う。<br> | 参照での代入とコピーでの代入を行う。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
#include <string> | #include <string> | ||
| 177行目: | 180行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== mutable ===== | ===== mutable ===== | ||
| 183行目: | 186行目: | ||
しかし、コピーのため、元の変数の値は変更できない。<br> | しかし、コピーのため、元の変数の値は変更できない。<br> | ||
mutableを指定した時、ラムダ式の引数リストの括弧は省略できない。<br> | mutableを指定した時、ラムダ式の引数リストの括弧は省略できない。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
#include <string> | #include <string> | ||
| 196行目: | 199行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
また、mutableを指定した時、明示的に戻り値を指定する場合は、以下のようにする。<br> | また、mutableを指定した時、明示的に戻り値を指定する場合は、以下のようにする。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
auto dRet = []() mutable -> double {return 3.14;}; | auto dRet = []() mutable -> double {return 3.14;}; | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== キャプチャの指示 ===== | ===== キャプチャの指示 ===== | ||
ラムダキャプチャ[]には、変数ごとにキャプチャの方法(コピーまたは参照)を指定できる。<br> | ラムダキャプチャ[]には、変数ごとにキャプチャの方法(コピーまたは参照)を指定できる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
| 221行目: | 224行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
また、一部の変数だけ指定して、残りは、キャプチャのデフォルトを指定することができる。<br> | また、一部の変数だけ指定して、残りは、キャプチャのデフォルトを指定することができる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
| 242行目: | 245行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
また、以下のように、デフォルトと同じキャプチャは指定できない。<br> | また、以下のように、デフォルトと同じキャプチャは指定できない。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
int a = 0, | int a = 0, | ||
b = 0; | b = 0; | ||
| 252行目: | 255行目: | ||
[=, a]{}(); // エラー | [=, a]{}(); // エラー | ||
[a, a]{}(); // エラー | [a, a]{}(); // エラー | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== thisポインタとキャプチャ ===== | ===== thisポインタとキャプチャ ===== | ||
thisポインタは、ポインタであるため、キャプチャがコピーでも参照でも、以下のように変数iは変更される。<br> | thisポインタは、ポインタであるため、キャプチャがコピーでも参照でも、以下のように変数iは変更される。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
| 275行目: | 278行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== ラムダ式を返す ===== | ===== ラムダ式を返す ===== | ||
std::functionを使用することで、ラムダ式を関数から返すことができる。<br> | std::functionを使用することで、ラムダ式を関数から返すことができる。<br> | ||
キャプチャがコピーであるため、変数strは破棄されない。<br> | キャプチャがコピーであるため、変数strは破棄されない。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
#include <string> | #include <string> | ||
| 301行目: | 304行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:C++]] | [[カテゴリ:C++]] | ||