logo-sun

コード書いとる??

C++のlambda式が便利過ぎます。
C++のlambda式が便利過ぎるんです。

とくに、thisのキャプチャが便利。lambda式の中でクラスのメンバ変数・メンバ関数が使える。

struct Hoge {
  int a;
  void f() { /* Do something. */ }

  void g() {
    auto l = [this]() {
      a = 0;
      f();
    };
  }
};


int main() {
  Hoge a;
}

thisのキャプチャ便利。


なーのーでーすーがー!!
このいっけん問題なさそうなコードで超ハマった.....

#include <iostream>
#include <functional>

struct Hoge {
  int value;
  std::function<void()> f;

  Hoge() :
    value(0)
  {
    f = [this]() {
      std::cout << value << std::endl;
      g();
    };
  }

  void g() {}
};


int main() {
  Hoge a;

  a.f();

  Hoge b = a;

  // b.valueを書き換えても結果が変わらない
  // a.valueを書き換えると結果が変わる
  b.value = 1;
  b.f();
}

クラスがコピーされたりすると特定の状況でキャプチャしたthisが未定義になる予感...!!

はーびっくりした...
数時間不具合と格闘して見つけたよ... でもまぁ、こうして学んでいくんだよね!!


ではまた次回。