Lambda ifadeleri

Lambda ifadeleri nesnenin bulunduğu yerde, anomim fonksiyonlar oluşturmada kullanılır. Dile C++11 ile birlikte eklendi, C++14 ile geliştirildi.

lamba ifadesi 3 bölümden oluşur:

[] () {}

  1. [] kapma listesi - kapma listesi lambdanın bulunduğu scope’tan değerle veya referansla değişken alabilir.
  2. () parametre listesi(opsiyonel, kullanmayabiliriz) - lambda’ya parametre geçisinde kullanılır
  3. {} fonksiyon gövdesi
	[kapma_listesi] (parametreler)
		mutable     (opsiyonel)
		constexpr   (opsiyonel)
		exception   (opsiyonel)
		return tipi (opsiyonel)
	{ 
	  fonksiyon govdesi	
	}

mutable kopyayla, yani [=] ile, geçilen parametreleri değiştirmek istediğimizde kullanmamız gereken bir anahtar sözcük.

constexpr fonksiyon değerlerinin derleme zamanında işleneceğini bildirir. Eğer lambda constexpr değilse ama olması gerekiyorsa, derleyici bunu bizim için yapacaktır.

exception lambdanın istisnai durumla karşılaştığında ne yapacağını belirlemek için.

En basit lambda tanımı şu şekildedir:

	auto lambdaFunc = []{ cout << "Hello World\n" };

veya

	auto lambdaFunc ( []{ cout << "Hello World\n" });
   lambdaFunc();

şeklinde çağırılır. Burada lambda bir isme atandı ve closure oluşturdu, ama böyle olmak zorunda değil.

   array<int, 5> intArray{1, 4, 7, 10, 12};                                                                                                                                          
   auto result = any_of(intArray.begin(), intArray.end(),                                                
                              [](int val) { return val % 3 == 0; });
  • lambda ifadesi parametre alabilir:
   auto lambdaFunc = [](string val){ cout << "Hello  " << val << '\n'; };
	lambdaFunc("World");
  • lambda ifadesi değer döndürebilir:
	auto lambdaFunc = [](string a, string b) -> string { return a + b; };
	auto greet = lambdaFunc("Hello ", "World");
  • lambda ifadesinin dönüş tipini belirtmeyebiliriz:
	auto lambdaFunc = [](string a, string b) { return a + b; };
	auto greet = lambdaFunc("Hello ", "World");
  • lambda ifadesine değer ile parametre geçebiliriz:
	auto greet {"Hello World\n"};
	auto lambdaFunc = [greet](){ cout << greet << '\n'; };
	lambdaFunc();
  • lambda ifadesine referans ile parametre geçebiliriz:
	string  s {"Hello"};
	auto lambdaFunc = [&s]() { s += "World\n"; };
	cout << s;
  • [&] ve [=] özel kapma listeleri kullanarak, sırasıyla, scope’taki tüm değişkenlere referans veya değer ile erişebiliriz.
	
	string s{"Hell"}, k {"Wor"};
	
	auto lambdaPassbyReferenceAll ([&] {s += "o ", k+="ld";});
	lambdaPassbyReferenceAll();
	
	auto lambdaPassbyValueAll ( [=] { cout << s + k << endl; } );
	lambdaPassbyValueAll();