C Lambda: arasındaki Fark "kesilebilir"-yakalama-referans
C bu gibi örneğin Lambda bildirebilirsiniz:
int x = 5;
auto a = [=]() mutable { x; std::cout << x << '\n'; };
auto b = [&]() { x; std::cout << x << '\n'; };
Her iki x
, fark nedir? yani değiştirmek için bana izin ver
CEVAP
Neler oluyor
İlk sadece x
kendi kopyasını değiştirin ve dışında x
değişmeden kalır.
İkinci olarak değiştirirx
dışında.
Her denedikten sonra: bir yazdırma deyimi ekleyin
a();
std::cout << x << "----\n";
b();
std::cout << x << '\n';
Bu baskı bekleniyor:
6
5
----
6
6
Neden
Lambda 12* *dikkate almak faydalı olabilir ([ifade.prim.lambda] Standart).
Var[...] kamu satır içi işlev çağrısı operatörü [...]const
üye işlev olarak bildirilmiş olan, ama sadece[...] ve lambdaexpression parameter-declaration-clause
mutable
takip eder(italik metin = standart teklif).
Eğer olarak düşünebilirsiniz
int x = 5;
auto a = [=]() mutable { x; std::cout << x << '\n'; };
==>
int x = 5;
class __lambda_a {
int x;
public:
__lambda_a () : x($lookup-one-outer$::x) {}
inline void operator() { x; std::cout << x << '\n'; }
} a;
ve
auto b = [&]() { x; std::cout << x << '\n'; };
==>
int x = 5;
class __lambda_b {
int &x;
public:
__lambda_b() : x($lookup-one-outer$::x) {}
inline void operator() const { x; std::cout << x << '\n'; }
// ^^^^^
} b;
Q:Ama eğer const
bir fonksiyonu varsa, neden hala x
değiştirebilirim?
Bir:Sadece değişiyor20* *dışında. Lambda x
kendi başvuru işlemi x
değiştirmezbaşvuruamareferans verilen değer.
Bu C , işaretçi/başvuru constness pointee/referencee içinden görülen constness değiştirmek için çalışıyor.
Neden C-yakalama-değeri 0 x'in la...
&Quot arasındaki fark;Bir" git ekl...
Arasındaki fark "@id/" ve &q...
Arasındaki fark "ekran" ve &...
'devre dışı=&; devre dışı" " ...