Neden değerleri const by-value-yakalanan, ancak yakalanan bazında referans nesneleri değildir: Bana göreLambda: Neden yakalanan değerler değerlerini oluşturuyor, ancak referans değerleri yakalamıyor?
int a;
auto compile_error = [=]()
{
a = 1;
}
auto compiles_ok = [&]()
{
a = 1;
}
bu mantıksız görünüyor ama standart gibi görünüyor? Özellikle yakalanan bir değerin istenmeyen modifikasyonu can sıkıcı bir böcek olabileceğinden, ancak sonuçların lambda kapsamıyla sınırlı olduğu, ancak referansla yakalanan nesnelerin istenmeyen modifikasyonlarının çoğunlukla daha ciddi etkilere yol açacağı ihtimalleri yüksektir.
Peki neden varsayılan başına const referans olarak yakalayamaz? Ya da en azından [const &] ve [&] destekleyin? Bu tasarımın nedenleri nelerdir?
olarak muhtemelen değeri tarafından yakalanan std :: cref sarılmış const referanslar kullanmak gerekiyor geçici çözüm? da const
olan
Bir referansın yakalanmasındaki önemli nokta, onu değiştirmektir. Bir değeri değiştirmek için * hayır * nedeni vardır - bu anlamsızdır. – Elazar
Referanslar değişmezdir ve bağlandıktan sonra asla değiştirilemez. Yani bir anlamda lambda ifadeleri, buradaki dilin geri kalanıyla tutarlıdır. Lambda ifadeleri için 'mutable' anlamını öğrenmek isteyebilirsiniz. –
@Elazar: Geçici olarak değerler değiştirilebilir, ancak yine de önerdiğiniz gibi bir değeri değiştirmek sorun değildir, başvurulan bir nesneyi değiştirmek ise istenmeyen (hata) olabilecek diğer kapsamları gerçekten etkiler. – valoh