2015-10-30 23 views
6

Varsayılan çekim modu kullanımında herhangi bir ek yük var mı?Kapanış varsayılan yakalama ek yükü

{ 
    Foo foo = ...; 
    Bar bar = ...; 
    [&]() 
    { 
     write(foo); 
    } 
} 

{ 
    Foo foo = ...; 
    Bar bar = ...; 
    [&foo]() 
    { 
     write(foo); 
    } 
} 

Kullanılmasa bile yakalanmak üzere çubuğun ilgili ile ilgili kullanılmasında herhangi bir maliyet var mıdır? o örtük veya açık yakalanır ama kopya tarafından yakalanan değilse

+4

"Maliyet" derken, bununla ne demek istiyorsun? Depolama? Uygulama vakti? Derleme zamanı? Başka bir şey? –

+0

@JoachimPileborg Yani ilk durumda daha fazla depolama gibi herhangi bir çalışma zamanı maliyeti varsa –

+3

Hiçbir maliyeti yoktur. İlk durumda yalnızca * kullandığınız değişkenler * yakalanır. – jalf

cevap

3

taslak referansla ele kişiler lambda fiyatları, C++ 14 standart (N4140) bölümünde 5.1.2 [expr.prim.lambda] kadar belirtilmemiş olan:

bir tablodur kapalı veya açık bir şekilde yakalandığında, ancak kopya tarafından yakalanmadığında başvuruyla yakalanır. ek adsız statik olmayan veri elemanlarının başvuruyla yakalanan varlıklar için kapağında bildirilmiş olup olmadığı belirtilmemiş. isimsiz birliğin bir üyesi diyor N2927 başvuran defect report 750: Implementation constraints on reference-only closure objects bkz Bu ifadeler bilerek uygulamaları bu sorunu optimize etmek için izin vermek için açık bırakıldı

referans ile yakalanan edilmeyecektir:

yeni ifadeler için "yeniden referans olarak" herhangi bir yeniden yazma veya kapatma üyesini artık belirtmez. "Referans" tarafından yakalanan varlıkların kullanımları, orijinal varlıkları etkiler ve bunu gerçekleştirecek mekanizma, tamamen uygulamadan geriye kalan 'dur.

2

N3337 5.1.2/15 veya N4527 (C++ 14 nihai taslak) 5.1.2/16

Bir işletme referans olarak yakalanır . ek adsız statik olmayan veri elemanlarının başvuruyla yakalanan varlıklar için kapağında bildirilmiş olup olmadığı belirtilmemiş.

+1

Not N3337, C++ 11'e en yakın taslaktır; “N4140” ise OP'nin soruyu etiketlediği C++ 14'e en yakın taslaktır. Farkımız bu soruyu etkilemese de, cevabımdan 'N4140' teklifinin farklı olduğunu görebiliyoruz. C++ 11 ve C++ 14 için cevabın farklı olduğu birçok durum vardır. Şu anda mevcut olan en son çalışma taslağı N4527 iken temel olarak C++ 1z. –