5 Temmuz 2019 Cuma

Mutable Lambda

Giriş
Açıklaması şöyle. Normalde lambda'nın kendisi const kabul edilir.Dolayısıyla kendi içinde tanımlanan değişkenlerin de sadece const metodlarının çağrılmasına izin verir. Böyle olmasın istiyorsak lambda mutable yapılır.
Unless the keyword mutable was used in the lambda-expression, the function-call operator is const-qualified and the objects that were captured by copy are non-modifiable from inside this operator().
Söz dizimi şöyle.
[captures](arguments) mutable { body }
                      ^^^^^^^
Örnek
Bu bir komite hatası diye düşünenler var. Açıklaması şöyle
This is a bug in std::function due to its type-erasure and copy semantics. It allows non-const-qualified operator() to be invoked, which can be verified with such a snippet:
Örnek
Şu kod derlenmez.
#include <memory>
int main()
{
  auto u = std::unique_ptr<int>();
  auto l = [v = std::move(u)]{
    v.reset(); // this doesn't compile
  };
}
Düzeltmek için şöyle yaparız.
auto l = [v = std::move(u)] mutable {
    v.reset();
};
Örnek
Şöyle yaparız.
const std::function<void()> f = [i = 0]() mutable { ++i; };

f(); // Shouldn't be possible, but unfortunately, it is


Hiç yorum yok:

Yorum Gönder