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.
Bu bir komite hatası diye düşünenler var. Açıklaması şöyle
Şu kod derlenmez.
Şöyle yaparız.
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.
Söz dizimi şöyle.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().
[captures](arguments) mutable { body }
^^^^^^^
ÖrnekBu 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