📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

編集の要約なし
文字列「source lang」を「syntaxhighlight lang」に置換
 
(同じ利用者による、間の1版が非表示)
16行目: 16行目:


== ラムダ式の文法 ==
== ラムダ式の文法 ==
  <source lang="c++">
  <syntaxhighlight lang="c++">
  int main(int argc, char *argv[])
  int main(int argc, char *argv[])
  {
  {
27行目: 27行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== 最小のラムダ式の定義 ==
== 最小のラムダ式の定義 ==
  <source lang="c++">
  <syntaxhighlight lang="c++">
  int main(int argc, char *argv[])
  int main(int argc, char *argv[])
  {
  {
38行目: 38行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
引数は省略可能であるため、さらに省略できる。<br>
引数は省略可能であるため、さらに省略できる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  int main(int argc, char *argv[])
  int main(int argc, char *argv[])
  {
  {
48行目: 48行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== 最小のラムダ式の呼び出し ==
== 最小のラムダ式の呼び出し ==
ラムダ式を呼び出すには、関数呼び出し式()を使用する。<br>
ラムダ式を呼び出すには、関数呼び出し式()を使用する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  int main(int argc, char *argv[])
  int main(int argc, char *argv[])
  {
  {
59行目: 59行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== サンプルコード ==
== サンプルコード ==
===== ラムダ式で書くHello World =====
===== ラムダ式で書くHello World =====
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
   
   
73行目: 73行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
===== ラムダ式を変数に代入する =====
===== ラムダ式を変数に代入する =====
ラムダ式を変数に代入することができる。関数ポインタのような感覚で呼び出せる。<br>
ラムダ式を変数に代入することができる。関数ポインタのような感覚で呼び出せる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
   
   
87行目: 87行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
===== ラムダ式を関数に渡す =====
===== ラムダ式を関数に渡す =====
ラムダ式を別の関数に渡すことができる。(コールバック関数)<br>
ラムダ式を別の関数に渡すことができる。(コールバック関数)<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
   
   
106行目: 106行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
===== ラムダ式に引数を与える =====
===== ラムダ式に引数を与える =====
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
  #include <string>
  #include <string>
123行目: 123行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
===== ラムダ式で戻り値を返す =====
===== ラムダ式で戻り値を返す =====
129行目: 129行目:
1つ目は、明示的に戻り値の型を定義していない。<br>
1つ目は、明示的に戻り値の型を定義していない。<br>
2つ目は、明示的に戻り値の型を定義している。アロー演算子の記法([]()->型)で表現している。<br>
2つ目は、明示的に戻り値の型を定義している。アロー演算子の記法([]()->型)で表現している。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
   
   
142行目: 142行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
===== 変数のキャプチャ =====
===== 変数のキャプチャ =====
ラムダ式は、式が定義される関数のスコープの変数をキャプチャできる。<br>
ラムダ式は、式が定義される関数のスコープの変数をキャプチャできる。<br>
JavaScriptでいうクロージャが、スコープにある変数を参照できることをイメージすること。<br>
JavaScriptでいうクロージャが、スコープにある変数を参照できることをイメージすること。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
  #include <string>
  #include <string>
159行目: 159行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
===== 参照の場合の代入 =====
===== 参照の場合の代入 =====
参照での代入とコピーでの代入を行う。<br>
参照での代入とコピーでの代入を行う。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
  #include <string>
  #include <string>
180行目: 180行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
===== mutable =====
===== mutable =====
186行目: 186行目:
しかし、コピーのため、元の変数の値は変更できない。<br>
しかし、コピーのため、元の変数の値は変更できない。<br>
mutableを指定した時、ラムダ式の引数リストの括弧は省略できない。<br>
mutableを指定した時、ラムダ式の引数リストの括弧は省略できない。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
  #include <string>
  #include <string>
199行目: 199行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
また、mutableを指定した時、明示的に戻り値を指定する場合は、以下のようにする。<br>
また、mutableを指定した時、明示的に戻り値を指定する場合は、以下のようにする。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  auto dRet = []() mutable -> double {return 3.14;};
  auto dRet = []() mutable -> double {return 3.14;};
  </source>
  </syntaxhighlight>
<br>
<br>


===== キャプチャの指示 =====
===== キャプチャの指示 =====
ラムダキャプチャ[]には、変数ごとにキャプチャの方法(コピーまたは参照)を指定できる。<br>
ラムダキャプチャ[]には、変数ごとにキャプチャの方法(コピーまたは参照)を指定できる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>


224行目: 224行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
また、一部の変数だけ指定して、残りは、キャプチャのデフォルトを指定することができる。<br>
また、一部の変数だけ指定して、残りは、キャプチャのデフォルトを指定することができる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
   
   
245行目: 245行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
また、以下のように、デフォルトと同じキャプチャは指定できない。<br>
また、以下のように、デフォルトと同じキャプチャは指定できない。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  int a = 0,
  int a = 0,
     b = 0;
     b = 0;
255行目: 255行目:
  [=, a]{}();  // エラー
  [=, a]{}();  // エラー
  [a, a]{}();  // エラー
  [a, a]{}();  // エラー
  </source>
  </syntaxhighlight>
<br>
<br>
===== thisポインタとキャプチャ =====
===== thisポインタとキャプチャ =====
thisポインタは、ポインタであるため、キャプチャがコピーでも参照でも、以下のように変数iは変更される。<br>
thisポインタは、ポインタであるため、キャプチャがコピーでも参照でも、以下のように変数iは変更される。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
   
   
278行目: 278行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
===== ラムダ式を返す =====
===== ラムダ式を返す =====
std::functionを使用することで、ラムダ式を関数から返すことができる。<br>
std::functionを使用することで、ラムダ式を関数から返すことができる。<br>
キャプチャがコピーであるため、変数strは破棄されない。<br>
キャプチャがコピーであるため、変数strは破棄されない。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
  #include <string>
  #include <string>
304行目: 304行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C++]]
[[カテゴリ:C++]]