総合内科専門医受験記録

総合内科専門医の受験を記録します

ラムダ式の「キャプチャの&」と「パラメータの&」は全然違う

(2024/1/9 スーパー意味不明な記載になっていたので書き直し)

ラムダ式が全然わからなくて、dfs書いてて一生エラー吐きまくってたんだけど、やっと解決したから記録しておく。
[&]と(int &x)はしっかり区別しなきゃだめ。

まずは例示から。

#include <bits/stdc++.h>
using namespace std;
int main()
{
   int a=1;
   int b=2;
   int c=3;

   auto f=[](int x, int y, int z){
        x*=3;
        y*=3;
        z*=3;
   };

   f(a,b,c);

    cout<<a<<b<<c<<endl;
}

この場合出力されるのは123なのか369なのかってことだけど、

123

です。
キャプチャの&:[&]は、外にある変数を参照で使えるという意味。
パラメータの&:(int &x)は引数として入力された変数を参照で使うという意味。

上のコードはパラメータに&がついてないからfはa,b,cをコピーで渡しているので、値は更新されない。
参照で渡すときはパラメータに&をつけて

#include <bits/stdc++.h>
using namespace std;
int main()
{
   int a=1;
   int b=2;
   int c=3;

   auto f=[](int &x, int &y, int &z){
        x*=3;
        y*=3;
        z*=3;
   };

   f(a,b,c);
    
    cout<<a<<b<<c<<endl;
}

にする。
これで答えは

369

になる。

キャプチャの&をつかうならば、

#include <bits/stdc++.h>
using namespace std;
int main()
{
   int a=1;
   int b=2;
   int c=3;

   auto f=[&](){
        a*=3;
        b*=3;
        c*=3;
   };

   f();
    
    cout<<a<<b<<c<<endl;
}

これで答えは

369

になる。

きっちり区別しながらコードを書くようにする。